Essential C++学习记录&笔记整理18(所有容器的共同操作、使用顺序性容器)

所有容器的共同操作

  • 所有容器类及string类的共同操作
    ==和!=运算符,返回true或false
    =运算符,将某个容器复制给另一个容器
    empty()会在容器无任何元素时返回true,否则返回false
    size()返回容器内目前持有的元素个数
    clear()删除容器的所有元素
    举个代码例子:
void comp(vector<int>&v1,vector<int>&v2)
{
	if(v1==v2)//两个容器(vector)是否相等,相等返回true,走if,
	//不相等则跳过if。(运用到==运算符)
	//if(v1!=v2)//两个容器(vector)是否不等,不等返回true,走if
	//不相等则跳过if。(运用到!=运算符)
	{
		return;
	}
	vector<int>t;
	t=v1.size()>v2.size()?v1:v2;
	//将较大的vector赋值给t(运用到=运算符)

其余的共同操作则直接在容器后写.共同操作函数名()即可。
其余共同操作请查阅网上或者更全的C++资料。

使用顺序性容器

  • 顺序性容器用来维护一组排列有序、类型相同的元素。vector和list是两个最主要的顺序性容器。
  • vector以一块连续内存来存放元素,所以可对vector随机访问。但vector增删效率低
  • list相当于双链表,增删效率高但不可随机访问(查改效率低)
  • 还有一个顺序性容器是deque,deque也是连续内存存储元素,deque对于最前端元素和最末端元素增删效率高。(标准库的queue是以deque实现,即以deque作为底部存储元素)
  • 你要用哪个顺序性容器则在程序开头包含哪个顺序性容器名的头文件即可
  • listslist;和vectorivec;是产生空的容器
  • listilist(1024);产生指定大小容器,其中每个元素以其默认值作为初值(int,double这类语言内置的算术类型,其默认值为0)
  • vectorivec(10,-1);产生指定大小容器并为每个元素指定初值(在这里每个元素初值是-1)
list<string>slist;//空容器
//给list添加元素
list<string>slist2(slist);//将slist复制给slist2

容器.insert()函数是重载函数,支持在容器的指定位置前插入1个或n个元素(元素值由我规定或者是默认值)
举几个例子:

#include
#include
using namespace std;
template<typename IteratorType,typename elemType>IteratorType find(IteratorType first,IteratorType last,const elemType &value)
{
    for(;first!=last;++first)
    {
        if(value==*first)
        {
            return first;
        }
    }
    return last;//走到这里证明没找到和value一样的元素,直接返回last指针。。。
}
template<typename elemType>
void display(const vector<elemType>&vec,ostream &os=cout)
{
    typename vector<elemType>::const_iterator iter=vec.begin();//原书中未在vector前加typename,你不加,编译器给你报错。(去掉试试),记下!//iterator的定义
    typename vector<elemType>::const_iterator end_it=vec.end();//如果是面对const vector,则用const_iterator来进行操作//iterator的定义
    //如果面对vector,就用iterator即可
    //若vec是空vector,则iter=end_it,for循环不会被执行
    for(;iter!=end_it;++iter)
    {
        os<<*iter<<' ';
    }
    os<<endl;
}
int main()
{
    string sval("Part Two");
    string alist[3]={"wocao","Part Two","aa"};
    vector<string>slist(alist,alist+3);//不要在slist和(之间加=!
    vector<string>::iterator it=find(slist.begin(),slist.end(),sval);
    //s example\main.cpp|10|error: no matching function for call to 'find(std::__cxx11::list >::iterator, std::__cxx11::list >::iterator, std::__cxx11::string&)'|
    //出现此错误信息,证明find函数没有被定义,需要定义或另包含一个头文件,记下!
    cout<<*it<<endl;
    slist.insert(it,8,string("dummy"));//在value(dummy)前插入count(8)个元素,这些元素的值都和value相同
    //s example\main.cpp|25|error: no match for 'operator<' (operand types are 'int' and 'std::__cxx11::list >::iterator {aka std::_List_iterator >}')|
    //出现此错误信息,证明有两个类型不匹配。
    display(slist);
    cout<<endl;
    int ia1[7]={1,1,2,3,5,55,89};
    int ia2[4]={8,13,21,34};
    vector<int>elems(ia1,ia1+7);
    vector<int>::iterator it2=find(elems.begin(),elems.end(),55);
    elems.insert(it2,ia2,ia2+4);//在position(it)前插入[first,last)所标示的各个元素,这个左闭右开的意思是first所指元素可被插入到某容器中,而last所指元素不可以,因为last指向最后一个元素的下一个位置
    display(elems);
    //elems.insert(it2);
    //上面这么写会报错,即s example\main.cpp|48|error: no matching function for call to 'std::vector::insert(std::vector::iterator&)'|
    //证明被调函数没有一个重载函数与其调用方式对应。。。。
    //display(elems);
    return 0;

}

其中:

 	string sval("Part Two");
    string alist[3]={"wocao","Part Two","aa"};
    vector<string>slist(alist,alist+3);//不要在slist和(之间加=!
    vector<string>::iterator it=find(slist.begin(),slist.end(),sval);
    //s example\main.cpp|10|error: no matching function for call to 'find(std::__cxx11::list >::iterator, std::__cxx11::list >::iterator, std::__cxx11::string&)'|
    //出现此错误信息,证明find函数没有被定义,需要定义或另包含一个头文件,记下!
    cout<<*it<<endl;
    slist.insert(it,8,string("dummy"));//在value(dummy)前插入count(8)个元素,这些元素的值都和value相同
    //s example\main.cpp|25|error: no match for 'operator<' (operand types are 'int' and 'std::__cxx11::list >::iterator {aka std::_List_iterator >}')|
    //出现此错误信息,证明有两个类型不匹配。
    display(slist);
    cout<<endl;

这个insert函数是该重载函数:

  • void insert(iterator position,int count,elemType value)
    可在position之前插入count个元素,这些元素的值都和value相同。
    附上程序运行图
    程序运行至.insert()前slist里的元素情况
    在这里插入图片描述
    运行至.insert()后slist里的元素情况
    在这里插入图片描述
	int ia1[7]={1,1,2,3,5,55,89};
    int ia2[4]={8,13,21,34};
    vector<int>elems(ia1,ia1+7);
    vector<int>::iterator it2=find(elems.begin(),elems.end(),55);
    elems.insert(it2,ia2,ia2+4);//在position(it)前插入[first,last)所标示的各个元素,这个左闭右开的意思是first所指元素可被插入到某容器中,而last所指元素不可以,因为last指向最后一个元素的下一个位置
    display(elems);
    //elems.insert(it2);
    //上面这么写会报错,即s example\main.cpp|48|error: no matching function for call to 'std::vector::insert(std::vector::iterator&)'|
    //证明被调函数没有一个重载函数与其调用方式对应。。。。
    //display(elems);
    return 0;

这个insert函数是该重载函数:

  • void insert(iterator1 position,iteratior2 first,iteraotr2 last)
    可在position之前插入[first,last)(注意区间,左闭右开,因为你不能在last指向的最后一个元素的位置的下一个位置上插入元素)所标示的各个元素,这些元素的值都和value相同。
    附上程序运行图
    程序运行至.insert()前elems里的元素情况
    在这里插入图片描述
    运行至.insert()后elems里的元素情况
    在这里插入图片描述
  • 程序整体运行情况如下
    Essential C++学习记录&笔记整理18(所有容器的共同操作、使用顺序性容器)_第1张图片
  • 还有一种形式是:iterator insert(iterator position)可在position之前插入元素。元素的初值为其所属类型的默认值。
  • list容器不支持偏移运算(比如我马上写到的erase()这个共同操作的第二个参数,这是错误写法),不可以写slist.erase(it1,it1+num_tries);。必须传入两个泛型指针(如it1、it2)给erase()

你可能感兴趣的:(C++)