1,容器的使用
调用 push_back 函数会在容器 container 尾部创建一个新元素,并使容器的长度加 1。新元素的值为 text_word 对象的副本,而 container 的类型则可能是 list、vector 或 deque。
除了 push_back 运算,list 和 deque 容器类型还提供了类似的操作:push_front
。这个操作实现在容器首部插入新元素的功能。
测试代码如下:
#include <iostream>
#include <list>
#include <deque>
#include <vector>
using namespace std;
int main()
{
list<int> ilist;
// add elements at the end of ilist
for (size_t ix = 0; ix != 4; ++ix)
ilist.push_back(ix);
// add elements to the start of ilist
for (size_t ix = 0; ix != 4; ++ix)
ilist.push_front(ix);
for(list<int>::iterator iter = ilist.begin();iter!=ilist.end();iter++)
{
cout<<*iter<<" ";
}
cout<<endl;
return 0;
}
输出结果:
tekken@tekken:~/C++WS$ ./a.out
3 2 1 0 0 1 2 3
函数 | 定义 |
---|---|
c.push_back(t) | 在容器 c 的尾部添加值为 t 的元素。返回 void 类型 |
c.push_front(t) | 在容器 c 的前端添加值为 t 的元素。返回 void 类型只适用于 list 和 deque 容器类型. |
c.insert(p,t) | 在迭代器 p 所指向的元素前面插入值为 t 的新元素。返回指向新添加元素的迭代器 |
c.insert(p,n,t) | 在迭代器 p 所指向的元素前面插入 n 个值为 t 的新元素。返回 void 类型 |
c.insert(p,b,e) | 在迭代器 p 所指向的元素前面插入由迭代器 b 和 e 标记的范围内的元素。返回 void 类型 |
2,容器大小的操作。
函数 | 定义 |
---|---|
c.size() | 返回容器 c 中的元素个数。返回类型为c::size_type |
c.max_size() | 返回容器 c 可容纳的最多元素个数,返回类型为c::size_type |
c.empty() | 返回标记容器大小是否为 0 的布尔值 |
c.resize(n) | 调整容器 c 的长度大小,使其能容纳 n 个元素,如果 n <c.size(),则删除多出来的元素;否则,添加采用值初始化的新元素 |
c.resize(n,t) | 调整容器 c 的长度大小,使其能容纳 n 个元素。所有新添加的元素值都为 t |
容器类型提供 resize 操作来改变容器所包含的元素个数。如果当前的容器长度大于新的长度值,则该容器后部的元素会被删除;如果当前的容器长度小于新的长度值,则系统会在该容器后部添加新元素:
list<int> ilist(10, 42); // 10 ints: each has value 42
ilist.resize(15); // adds 5 elements of value 0 to back of ilist
ilist.resize(25, -1); // adds 10 elements of value -1 to back of ilist
ilist.resize(5); // erases 20 elements from the back of ilist
resize 操作可能会使迭代器失效。在 vector 或 deque 容器上做 resize 操作有可能会使其所有的迭代器都失效。
对于所有的容器类型,如果 resize 操作压缩了容器,则指向已删除的元素迭代器失效。
3,访问元素
如果容器非空,那么容器类型的 front 和 back 成员将返回容器内第一个或最后一个元素的引用:
// check that there are elements before dereferencing an iterator
// or calling front or back
if (!ilist.empty())
{
// val and val2 refer to the same element
list<int>::reference val = *ilist.begin();
list<int>::reference val2 = ilist.front();
// last and last2 refer to the same element
list<int>::reference last = *--ilist.end();
list<int>::reference last2 = ilist.back();
}
这段程序使用了两种不同的方法获取时 ilist 中的第一个和最后一个元素的引用。 直接的方法是调用 front 或 back 函数。 间接的方法是, 通过对 begin操作返回的迭代器进行解引用,或对 end 操作返回的迭代器的前一个元素位置进行解引用,来获取对同一元素的引用。在这段程序中,有两个地方值得注意:
end 迭代器指向容器的超出末端的下一位置,因此必须先对其减 1 才能获取最后一个元素;另一点是,在调用 front 或 back 函数之前,或者在对 begin 或 end 返回的迭代器进行解引用运算之前,必须保证 ilist 容器非空。如果该list 容器为空,则 if 语句内所有的操作都没有定义。
函数 | 定义 |
---|---|
c.back() | 返回容器 c 的最后一个元素的引用。如果 c 为空,则该操作未定义 |
c.front() | 返回容器 c 的第一个元素的引用。如果 c 为空,则该操作未定义 |
c[n] | 返回下标为 n 的元素的引用,如果 n <0 或 n >= c.size(),则该操作未定义,只适用于 vector 和 deque 容器 |
c.at(n) | 返回下标为 n 的元素的引用。如果下标越界,则该操作未定义只适用于 vector 和 deque 容器 |
4,删除元素
函数 | 定义 |
---|---|
c.erase(p) | 删除迭代器 p 所指向的元素。返回一个迭代器,它指向被删除元素后面的元素。如果 p 指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。如果 p 本身就是指向超出末端的下一位置的迭代器,则该函数未定义 |
c.erase(b,e) | 删除迭代器 b 和 e 所标记的范围内所有的元素。返回一个迭代器,它指向被删除元素段后面的元素。如果 e 本身就是指向超出末端的下一位置的迭代器,则返回的迭代器也指向容器的超出末端的下一位置 |
c.clear() | 删除容器 c 内的所有元素。返回 void |
c.pop_back() | 删除容器 c 的最后一个元素。返回 void。如果 c 为空容器,则该函数未定义 |
c.pop_front() | 删除容器 c 的第一个元素。返回 void。如果 c 为空容器,则该函数未定义。只适用于 list 或 deque 容器 |
5,删除容器内所有元素
要删除容器内所有的元素,可以调用 clear 函数,或将 begin 和 end 迭代器传递给 erase 函数。
slist.clear(); // delete all the elements within the container
slist.erase(slist.begin(), slist.end()); // equivalent
网友评论