顺序容器简介:
标准库定义了三种顺序容器类型:vector、list 和 deque。
标准库还提供了三种容器适配器(adaptors): stack, queue, priority_queue
顺序容器的定义:
#include <vector> //第一种
vector<string> svec; //第一种
#include <list> //第二种
list<int> ilist; //第二种
#include <deque> //第三种
deque<Sales_item> items; //第三种
顺序容器的初始化:
① C<T> c;
② C c(c2);
③ C c(b,e);//创建 c,其元素是迭代器 b 和 e 标示的范围内元素的副本。
④ C c(n,t);
⑤ C c(n);
关于③:
尽管不能直接将一种容器内的元素复制给另一种容器,但系统允许通过传递一对迭代器间接实现该实现该功能。使用迭代器时,不要求容器类型相同。容器内的元素类型也可以不相同,只要它们相互兼容,能够将要复制的元素转换为所构建的新容器的元素类型,即可实现复制。
e.g.1:
vector<string>::iterator mid = svec.begin() + svec.size()/2;
deque<string> front(svec.begin(), mid);
deque<string> back(mid, svec.end());
e.g.2:
因为指针就是迭代器,所以允许使用内置数组中的一对指针初始化容器:
char *words[] = {"stately", "plump", "buck", "mulligan"};
size_t words_size = sizeof(words)/sizeof(char *);
list<string> words2(words, words + words_size);
还可以定义元素类型为容器类型的容器:
vector< vector<string> > lines; // vector of vectors
迭代器范围(iterator range):
C++ 语言使用一对迭代器标记迭代器范围(iterator range),这两个迭代
器分别指向同一个容器中的两个元素或超出末端的下一位置,通常将它们命名为
first 和 last,或 beg 和 end,用于标记容器中的一段元素范围。
。该范围内的元素包括迭代器 first 指向的元素,以及从 first 开始
一直到迭代器 last 指向的位置之前的所有元素。如果两个迭代器相等,则迭代
器范围为空。
此类元素范围称为左闭合区间(left-inclusive interval),其标准表示
方式为:
[ first, last )
区别end()与back():
if (!ilist.empty())
{
list<int>::reference val = *ilist.begin();//returns an iterator to the element,
list<int>::reference val2 = ilist.front();this function returns a direct reference
list<int>::reference last = *--ilist.end();returns an iterator to the element,
list<int>::reference last2 = ilist.back(); // this function returns a direct reference
}
区别1:end()返回一个迭代器,back()返回对元素的引用。
区别2:end()指向容器中最后一个元素的下一位。