Chinaunix首页 | 论坛 | 博客
  • 博客访问: 246922
  • 博文数量: 108
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 314
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-29 10:58
文章分类

全部博文(108)

文章存档

2015年(20)

2014年(88)

我的朋友

分类: C/C++

2014-07-09 21:17:57

标准库类型(三)

--iterator


序言:

    迭代器是一种检查容器内元素并遍历容器元素的数据类型。

    所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作;因此,现代C++更倾向于使用迭代器而不是下标操作访问容器元素。


正文:

1、容器的iterator类型

每个标准库容器类型都定义了一个名为iterator的成员;


  1. vector<int>::iterator iter;  


2beginend操作

    由end操作返回的迭代器指向vector的“末端元素的下一个”,通常称为“超出末端迭代器”。表明了它指向了一个不存在的元素。

   如果vector为空,则begin返回的迭代器与end返回的迭代器相同。

   通常,end返回的迭代器只代表一个哨兵作用,表示我们已经处理完vector中的所有元素。


  1. for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)  
  2.         *iter = 0;  


3++iter表示向前移动迭代器指向容器中的下一个元素。

4、由于end操作返回的迭代器并不指向任何元素,因此不能对他进行解引用和自增操作。

5、如果两个迭代器对象指向同一个元素,则他们相等,==运算符返回真,!=运算符返回假。


6const_iterator

该类型只能用于读取容器内的元素,而不能改变其值。我们对const_iterator类型解引用时,则可以得到一个指向const对象的引用。

  1.    for (vector<int>::const_iterator iter = ivec.begin();iter != ivec.end(); ++iter)  
  2. {  
  3.     cout << *iter << endl;  //ok  
  4.     *iter = 0;              //ERROR  
  5. }  


7、不要把const_iterator对象与constiterator对象混淆。

  1. const vector<int>::iterator iter = ivec.begin();  
  2. *iter = 0;  //OK  
  3. ++iter;     //ERROR  

  1. //P87 习题3.17 (1)  
  2. int main()  
  3. {  
  4.     freopen("input.txt","r",stdin);  
  5.     vector<int> ivec;  
  6.     int value;  
  7.     while (cin >> value)  
  8.     {  
  9.         ivec.push_back(value);  
  10.     }  
  11.   
  12.     for (vector<int>::iterator iter = ivec.begin(); iter < ivec.end() - 1; iter += 2)  
  13.     {  
  14.         cout << *iter + *(iter + 1) << endl;  
  15.     }  
  16.     if(ivec.size() % 2)  
  17.     {  
  18.         cout << "The last element " << *(ivec.end() - 1)  
  19.              << " is not been summed!" << endl;  
  20.     }  
  21.     return 0;  
  22. }  

  1. //(2)  
  2. int main()  
  3. {  
  4.     freopen("input.txt","r",stdin);  
  5.     vector strVec;  
  6.     string value;  
  7.     while (cin >> value)  
  8.     {  
  9.         strVec.push_back(value);  
  10.     }  
  11.   
  12.     for (vector::iterator iter = strVec.begin(); iter != strVec.end(); ++iter)  
  13.     {  
  14.         for (string::size_type i = 0; i != iter -> size(); ++i)  
  15.         {  
  16.             (*iter)[i] = toupper((*iter)[i]);  
  17.         }  
  18.     }  
  19.   
  20.     size_t cnt = 1;  
  21.     for (vector::iterator iter = strVec.begin(); iter != strVec.end(); ++iter)  
  22.     {  
  23.         cout << *iter << ' ';  
  24.         ++ cnt;  
  25.         if (!(cnt % 8))  
  26.         {  
  27.             cout << endl;  
  28.         }  
  29.   
  30.     }  
  31.     return 0;  
  32. }  

8、迭代器的算术操作

  1. /* 
  2. *使mid指向ivec最靠近正中间的元素。 
  3. *不能使用: 
  4. *vector::iterator mid = (ivec.begin() + ivec.end()) / 2; 
  5. *因为将两个迭代器相加是为定义的! 
  6. */  
  7.     vector<int>::iterator mid = ivec.begin() + ivec.size()/2;  
  8.   
  9. /* 
  10. *difference_type类型可以保证足够大以存储任何两个迭代器之间的距离。 
  11. */  
  12.     difference_type = iter1 – iter2;  

9、谨记:任何改变vector长度的操作都会使已存在的迭代器失效!!!

转载:http://blog.csdn.net/zjf280441589/article/details/22984307

阅读(1056) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~