这些操作会改变容器的代销;array不支持这些操作 | |
forward_list有自己专有版本的insert和emplace | |
forward_list不支持push_back和emplace_back | |
vector和string不支持push_front和emplace_front | |
c.push_back(t) c.emplace_back(args) | 在c的尾部创建一个值为t或由args创建的元素。返回void |
c.push_front(t) c.emplace_front(args) | 在c的头部创建一个值为t或由args创建的元素。返回void |
c.push(p, t) c.emplace(p, args) | 在迭代器p指向的元素之前创建一个值为t或由args创建的元素。返回指向新添加元素的迭代器 |
c.insert(p, n, t) | 在迭代器p指向的元素之前插入n个值为t的元素。返回指向新添加的第一个元素的迭代器;若n为0,返回p |
c.insert(p, b, e) | 在迭代器p指向的元素之前插入迭代器b和e指定范围内的元素。返回指向新添加的第一个元素的迭代器;若范围为空,返回p |
c.insert(p, i1) | i1是一个花括号包围的元素值列表,将这些给定值插入到迭代器p指向的元素之前。返回指向新添加的第一个元素的迭代器;若范围为空,返回p |
warning:向一个vector、string或deque插入元素会使所有指向容器的迭代器、引用和指针失效
当调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们低啊用一个emplace成员函数时,则是将参数传递至元素类型的构造函数中。
//在c的末尾构造一个Sales_data对象
//使用三个参数的Sales_data构造函数
c.emplace_back("978-0590353403", 25, 15.99);
//错误:没有接受三个参数的push_back版本
c.push_back("978-0590353403", 25, 15.99);
//正确:创建一个临时的Sales_data对象传递给push_back
c.push_back(Sales_data("978-0590353403", 25, 15.9));
at和下标操作只适用于string、vector、deque和array | |
back不适用于forward_list | |
c.back() | 返回c中尾元素的引用。若c为空,函数行为未定义 |
c.front() | 返回c中头元素的引用。若c为空,函数行为未定义 |
c[n] | 返回c中下标为n的元素元素的引用,n是一个无符号整数。若n>=c.size(),函数行为未定义 |
c.at(n) | 返回c中下标为n的元素元素的引用。若下标越界,则抛出out_of_range异常 |
if(!c.empty())
{
c.front() = 42; //将42赋予c中第一个元素
auto &v = c.back(); //获取指向c中最后一个元素的引用
v = 1024; //改变c中元素
auto v2 = c.back(); //获取拷贝
v2 = 0; //未修改c中元素
}
vector<string> svec; //空vector
cout << svec[0]; //运行时错误
cout << svec.at(0); //抛出out_of_range异常
这些操作会改变容器大小,不适用于array | |
forward_list有特殊版本的erase | |
forward_list不支持pop_back;vector和string不支持pop_front | |
c.pop_back() | 删除c中尾元素。若c为空,则函数行为未定义。函数返回void |
c.pop_front() | 删除c中首元素。若c为空,则函数行为未定义。函数返回void |
c.erase(p) | 删除迭代器p所指定的元素,返回一个指向被删元素之后的元素的迭代器。若p指向尾元素,则返回尾后(off_the_end)迭代器。若p是尾后迭代器,则函数行为未定义 |
c.erase(b,e) | 删除迭代器b和e所指定范围内的元素。返回一个指向最后一个被删元素之后的元素迭代器,若e本身就是尾后迭代器,则函数也返回尾后迭代器 |
c.clear() | 删除c中的所有的元素。返回void |
lst.before_begin() lst.cbefore_begin() | 返回一个指向链表首元素之前不存在的元素的迭代器,不能解引用。cbefore_begin()返回一个const_iterator |
lst.insert_after(p, t) lst.insert_after(p, n, t) lst.insert_after(p, b, e) lst.insert_after(p, il) | 在迭代器p之后的位置插入元素(b和e不能指向lst内,il是一个花括号列表)返回一个指向最后一个插入元素的迭代器。如果范围为空,则返回p。若p是尾后迭代器,则函数行为为定义 |
emplace_after(p, args) | 使用args在p指定的位置之后创建一个元素。返回一个指向这个新元素的迭代器。若p是尾后迭代器,则函数行为为定义 |
lst.erase_after(p) lst.erase_after(b, e) | 删除元素。返回一个指向被删除元素之后的元素的迭代器。若不存在这样的元素,则返回尾后迭代器。如果p指向lst的尾元素或者是尾后迭代器,则函数行为未定义 |
容器操作对迭代器的影响
在容器中添加元素:
- 如果容器是vector或string,且存储空间被重新分配,则指向容器的迭代器、引用和指针都会失效。如果存储空间未重新分配,指向插入位置之后元素的迭代器、引用和指针将会失效
- 对于deque,插入到除首尾位置之外的任何位置都会导致迭代器、引用和指针失效。如果在首尾位置添加元素,迭代器会失效,但指向元素的引用和指针不会失效
- 对于list和forward_list,无影响
在容器中删除元素
- 指向被删除元素的迭代器、引用和指针会失效
- 对于list和forward_list,无影响
- 对于deque,删除除首尾位置之外的任何位置都会导致迭代器、引用和指针失效。如果在首尾位置删除元素,尾后迭代器会失效,但其他迭代器和指向元素的引用和指针不会失效
- 对于vector和string,指向被删元素之前的迭代器、引用和指针仍有效。
- 删除元素时,尾后迭代器总会失效
shrink_to_fit只适用于vector、string和deque | |
capacity和reverse只适用于vector和string | |
c.shrink_to_fit() | 将capacity()减少为和size()相同大小 |
c.capacity() | 不重新分配内存空间的话,c可以保存多少元素 |
c.reverse(n) | 分配至少能容纳n个元素的内存空间 |