#include<list>
#include<vector>
#include<string>
#include<queue>
#include<forward_list>
#include<iostream>
#include<array>
int main() {
using namespace std;
list<string>authors = { "Miltor","Shakepsare","Austen" };
vector<const char*>artices = { "a","an","the" };
list<string> list2(authors);
forward_list<string> wordes(artices.begin(), artices.end());
vector <int>ivec(10, -1);
array<int, 10>aval;//10个默认初始化的int
for (auto s : aval) {
cout << s <<endl;
}
system("pause");
return 0;
};
赋值和swap
c1=c2; //将c1的内容替换为c2的拷贝
c1={a,b,c};//赋值后,c1的大小为3
array<int,6>a1={0,1,2,3,4,5};
array<int,10>a2={0};所有元素均为0;
a1=a2;//替换a1元素
a2={0}//error 不能将一个花括号列表赋予数组
使用assign(仅顺序容器)
list<string>names;
vector<const char*>oldstyle;
//将names中的元素替换为指定范围中的元素的拷贝.assign的参数决定了容器中有多少个元素以及他们的值什么
names.assign(oldstyle.cbegin(), oldstyle.cend());
system("pause");
list<string>slist1(1);
slist1.assign(10, "maya");//10个元素,每个都maya
使用swap
vector<string>svec1(10);
vector<string>svect2(20);
cout << "交换前: svec1 --" << svec1.size() << " svec2 --" << svect2.size() << endl;
swap(svec1, svect2);
cout << "交换后: svec1 --" << svec1.size() << " svec2 --" << svect2.size() << endl;
system("pause");
output:
交换前: svec1 --10 svec2 --20
交换后: svec1 --20 svec2 --10
顺序容器操作
向顺序容器添加元素的操作 |
---|
这些操作会改变容器大小,array不支持这些操作 |
forward_list 有自己 insert和empleace |
forward_list 不支持push_back和emplace_back |
vector和string不支持push_front和emplace_front |
c.push_back(T) 在c的尾部创建一个值为t或由argsc创建的元素返回void |
c.emplace_back(args) |
c.push_front(t) 在c的头部创建一个值为t或由argsc创建的元素返回void |
c.emplace_front(args) |
c.insert(p,t) 在迭代器p指向的元素之前创建一个值为t或由args创建的元素,返回指向新添加的第一个元素的迭代器;或n为0,则返回p |
c.insert(p,b,e) 将迭代器b和e指定的范围内插入到迭代器p指向的元素之前.b和e不能指向c中的元素.返回指向新添加的第一个元素的迭代器;若范围为空,返回p |
c.insert(p,il) li是一个花括号包围的元素之列表,将这些给定值插入到迭代器p指向的元素之前,返回指向新添加第一个元素的迭代器,若列表为空,则返回p |
emplace_back() 和 push_back 的区别
通常使用push_back()向容器中加入一个右值元素(临时对象)的时候,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题是临时变量申请的资源就浪费
emplace_back 在容器尾部添加一个元素,这个元素原地构造,不需要触发拷贝构造和转移构造。而且调用形式更加简洁,直接根据参数初始化临时对象的成员
顺序容器的删除操作
这些操作会改变容器大小,所以不适用array
forward_list有特殊版本的erase
forward_list不支持pop-back;vector和string不支持pop_front.
c.pop_back() 删除尾元素
c.pop_front() 删除首元素
c.erase(p) 删除指定元素,返回删除元素之后的迭代器
c.erase(b,e)删除范围内的元素,返回删除元素之后的迭代器
c.clear() 删除所有元素
forward_list中插入删除元素操作 |
---|
lst.before_begin() 返回指向链表首元素之前并不存在的元素的迭代器,此迭代器不能解引用。 |
lst.cbefore_begin() cbefore_begin()返回一个const_iterator |
lst.insert_after(p,t) 在迭代器p之后的位置插入元素。t是一个对象,n是数量,b和e是表示范围的一对迭代器(b和e不能指向lst内),il是一个花括号列表。返回一个指向最后一个插入lst.insert_after(p,n,t) 返回指向最后一个插入元素的迭代器。如果范围为空,则返回p,若p为尾后迭代器,则函数行为未定义。 |
lst.insert_after(p,b,e) |
lst.insert_after(p,il) |
emplace_after(p,args) 使用args在p指定的位置之后创建一个元素,返回一个指向这个新元素的迭代器。若p为尾后迭代器,则函数的行为未定义 |
lst.erase_after(p) 删除p指向的位置之后的元素,或删除从b之后直到(但不包含)e之间的元素。返回一个指向被删除元素之后元素的迭代器,若不存在这样的元素,则返回尾后迭代器,如果p指向lst的尾元素或者是一个尾后迭代器,则函数的行为未定义 |