C++中顺序容器vector/deque/list/forward_list/array/string相关操作梳理

容器构造函数

C<T>  c;创建容器时,需要提供容器内部保存元素的类型。
C    c;        创建一个空容器。
C    c(n);创建包含n个元素的容器。容器内的元素需具有默认构造函数,或者能进行初始化。
C    c(n,p);创建包含n个值为p的元素。
C   c(c1.iter1,c1.iter2);

创建容器c,包含元素为c1的迭代器 [iter1,iter2)范围内的元素(注意左右开闭区间)。需要注意的是,c和c1可以是不同类型的元素。例如c1可能是list<int>,c可以是vector<int>,此时仍然可以用c1的迭代器来初始化c。

C    c(c2);创建容器c,其为c2的拷贝。
C    c{a,b,c...};创建容器c,以花括号中的值对其进行列表初始化。

vector容器

//构造函数
vector<int> v1;                             //v1为空
vecotr<int> v2(3);                          //v2元素为0 0 0
vector<int> v3(4,5);                        //v3元素为5 5 5 5
vector<int> v4(v3.begin(),v3.begin()+2);    //v5为拷贝v3的 [0,2)中的元素,5 5(不包括第v3[2])
    list<char*> li={"hello","world"};
    vector<string> v4_(li.begin(),li.end());   //v4_内的元素为2个: "hello" "world"
vector<int> v5(v2);                         //v4为v2的拷贝,其值为0 0 0
vector<int> v6{1,2,3,4};                    //v6中的元素为 1 2 3 4


//赋值 
vector<int> v1;    //v1为空
vector<int> v2;    //v2为空
v1 = {1,2,3};      //v1内包含三个元素: 1,2,3
v2 = v1;           //v2内包含三个元素: 1,2,3
v2 = {4,5,6};      //v2内包含三个元素: 4 5 6

//赋值assign(arg)函数,赋值操作
v1.assign(3,4);                    //v1包含3个元素: 4 4 4
v1.assign(v2.begin(),v2.end());    //v1包含3个元素: 4 5 6
v1.assign({1,2,3});                //v1利用列表内容进行初始化,v1包含3个元素:1 2 3

//交换swap(a,b)函数,将两个容器a和b中所有元素交换
v1.swap(v2);        //v1和v2内的所有的元素交换。v1内包含三个元素:4 5 6,v2内包含三个元素:1 2 3
swap(v1,v2);        //和上面的v1.swap(v2)效果完全相同。统一使用swap(v1,v2),而不是成员函数的  
                    //v1.swap(v2)是一个好习惯

//向后添加元素push_back(arg)成员函数,在容器后面添加
//v1此时的元素为{1,2,3}
v1.push_back(4);    //v1 : 1 2 3 4
//vector 不支持push_front()操作;

//向后添加元素emplace_back(arg)
v1.emplace_back(5)    //v1:1 2 3 4 5
/*emplace_back(arg)中arg必须为元素的构造函数,此例中即 5 是int的构造函数
例如person的构造函数为person alan("Alan",25);则见下述*/
vector<person> class10;
person Mike("Mike",14);
person Alice("Alice",15);
//向class 10 中添加同学元素时,可以用下述方法
class10.push_back(Mike);
class10.push_back(person("Bob",15));
class10.emplace_back("Alan",18);
class10.push_back("Tom",12);        //错误
class10.emplace_back(Alice);        //错误
//插入emplace(p,arg); 在迭代器p指向的元素之前插入一个元素
vector<int> v1{1,2,3};
v1.emplace(v1.begin(),10);        //v1: 10 1 2 3
//vector不支持emplace_front();操作


//插入insert(arg);返回指向的第一个插入元素的迭代器
vector<int> v2{4,5,6};
//c.insert(p,t);在p迭代器之前插入元素t,该函数返回指向t的迭代器
v1.insert(v1.begin(),5);       // v1: 5 10 1 2 3 
//c.insert(p,n,t);c在p迭代器之前插入n个t元素,返回指向第一个插入元素的迭代器
v1.insert(v1.begin(),2,1);     //返回指向begin的迭代器;v1:1 1 5 10 1 2 3
//c.insert(p,b,e); 在迭代器p之前插入迭代器[b,e)范围内的迭代器
v1.insert(v1.end(),v2.begin(),v2.end());         //v1:1 1 5 10 1 2 3 4 5 6         
//c.insert(p,li);在迭代器p之前插入列表li                                            
v2.insert(v2.begin(),{1,2,3});    //列表插入 v2:1 2 3 4 5 6


//删除操作pop_back();删除最后一个元素
vector<int> v1{1,2,3};            //v1:1 2 3
v1.pop_back();                    //v1: 1 2
//vector 不支持pop_front()操作;

//删除操作erase();返回指向最后一个被删除元素下一个元素的迭代器
vector<int> v1{1,2,3,4,5};        //v1: 1 2 3 4 5
//c.erase(p);删除迭代器p位置处的元素
v1.erase(v1.begin());             //v1:2 3 4 5
//c.erase(b,e);删除容器中[b,e)范围内的元素
v1.erase(v1.begin(),v1.begin()+2);    //v1: 4 5

//back();front();成员函数;
vector<int> v1{1,2,3,4,5};
int k = v1.front();                //k = 1
k = v1.back();                    //k = 5

//删除clear();清除容器c中的所有元素
v1.clear();                //v1:空

容器比较常用的成员函数如上,下表将各类顺序容器可以使用的成员函数进行了汇总,哪些成员函数可以调用,哪些不可以调用,例如vector容器就不支持push_front()操作。(这个表是我搬运的,原作者制作不易,感谢)

                                                                                         顺序容器-->

                                                  操作 

vector<int>

string

list<int>

forward_list<int>

deque<int>

array<int,10>

初始化

C c1(c2),c1=c2,c{a,b,c…},c={a,b,c…}

c1,c2等大小

C c(b,e)

X

C c(n),c(n,t) n个值为t的元素

X

赋值和swap

swap(c1,c2),c1.swap(c2)(比拷贝快)

√(慢)

C c.assign(b,e),c.assign(l),c.assign(n,t)

X

容器的大小

size()返回容器的大小

X

max_size()返回>=容器的容量值

empty(),size()=0返回true

添加元素

X

c.push_back(t),c.emplace_back(args)

返回值为void

X

X

c.push_front(t),c.emplace_front(args)

返回值为void

X

X

X

c.insert(p,t),c.emplace(p,args),c.insert(p,n,t),c.insert(p,b,e),c,insert(p,l)

插入位置为p之前,返回为指向第一个插入元素的迭代器,若(b,e)或l为空,则返回p,(b,e)不能指向c

尾部位置较快

尾部位置较快

都很快

X

有自己特有的函数

在首尾之外的位置插入很耗时

X

访问元素(返回值都为引用)

c.back()返回c中尾元素的引用

X

c.front()返回c中首元素的引用

c[n],c.at(n),

X

X

删除元素

c.pop_back()删除尾元素,返回void

X

X

c.pop_front()删除首元素,返回void

X

X

X

c.erase(p),c.erase(b,e),返回最后一个被删除的元素的下一个位置

X(有自己的版本)

X

c.clear(),删除所有元素,返回void

X

改变容器大小resize,若容器缩小迭代器,引用和指针失效

c.resize(n),c.resize(n,t) 大小n,值为t

X

c.shrink_to_fit()设置capacity()=size()

X

X

X

c.capacity(),不重新分配内存保存元素数;c.reserve(n),分配至少能容纳n个元素的内存

X

X

X

X

//未完待续,后续归纳forward_list容器的特殊成员函数。今儿个没时间码字了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ah_yl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值