初学容器,容易犯错的地方
1.vector,list和deque都是顺序容器。其中vector和deque都可以通过下标访问,而list不能
2. 容器的begin和end操作
c.begin()返回一个迭代器,它指向容器c的第一个元素
c.end()返回一个迭代器,它指向容器c的最后一个元素的
c.rbegin()返回一个逆序迭代器,它指向容器c的最后一个元素
c.rend()返回一个逆序迭代器,它指向容器c的第一个元素的前面一个元素
注意以上操作的返回的迭代器类型,前两个是iterator,后面一个是reverse_iterator。乱了顺序是不行的
请看下面一段代码:
1 #include <iostream> 2 #include <vector> 3 #include <list> 4 #include <deque> 5 #include <string> 6 using namespace std; 7 8 int main() 9 { 10 int i = 0; 11 char *words[] = {"stately","plump","buck","mulligan"}; 12 size_t words_size = sizeof(words) / sizeof(char *); 13 cout << "数组大小:" << words_size << endl; 14 vector<string> words2(words,words+words_size); 15 cout << "我采用迭代器的方式逆序访问容器:" << endl; 16 for(vector<string>::reverse_iterator it=words2.rbegin();it!=words2.rend( );++it) 17 { 18 cout << "list容器内内容为:"<< *it << endl; 19 } 20 cout << "现在采用容器大小的方式访问容器:" << endl; 21 for(i = 0;i < words2.size();++i) 22 { 23 cout << "list容器内内容为:" << words2[i] << endl; 24 } 25 return 0; 26 }
上面的代码如果将vector换成deque是没问题的,但是如果换成list程序就会出错,这就验证了1.
如果将reverse_iterator换成iterator,则程序也会出错,那时因为没注意到2.
3.vector和deque类型迭代器支持的操作
iter + n 在迭代器上加(减)整数值n,将产生指向容器前面(后面)第n个元素的迭代器
iter - n
iter1 += iter2 这是迭代器加减法的符合预算:将iter1加上或减去iter2的预案算结果赋给iter
iter1 -= iter2
iter1 - iter2 连个迭代器的减法,其运算结果加上右边的迭代器既得左边的迭代器,这两个迭代器必须指向同一个容器中的元素或超出容器末端的下一位置。只适用于vector和deque容器
>,<,>=,<= 迭代器的关系操作符。当一个迭代器指向的元素在容器中位于另一个迭代器指向的元素之前,则前一个迭代器小于后一个迭代器。关系操作符的两个迭代器必须指向同意容器的元素或超出容器末端的下一个位置。只适用于vector和deque容器