001 | /*- ========================================================== |
002 | * 文件名 :STL_con_ite_2.cpp |
003 | * 开发人员:袁培荣 |
004 | * 当前版本:1.0.0.2595 |
005 | * 创建时间:2012-05-20 |
006 | * 修改时间:2012-05-20 |
007 | * 功能说明:STL 容器和迭代器连载2_迭代器 |
008 | * 版权说明:版权所有 袁培荣 YuanPeirong |
009 | * 编译环境:Windows 7(x64) SP1 简体中文专业版 |
010 | * 编译器: Visual Studio 2010 SP1(中文旗舰版) |
011 | MinGW 20120426 GNU GCC 4.6.2 |
012 | Visual C++ 6.0 SP6(中文企业版) |
013 | - ==========================================================*/ |
014 |
015 | #include <iostream> |
016 | #include <vector> //包含STL 的vector 头文件才能使用vector |
017 |
018 | using std::cout; |
019 | using std::endl; |
020 | using std::vector; //vector是一个类模板,定义在命名空间std里面 |
021 |
022 | int main( int argc, char * argv[]) |
023 | { |
024 | //在STL vector 介绍连载1-2-3中, |
025 | //曾经初步讲解了vector的用法,下面来介绍迭代器 |
026 | |
027 | vector< int > v1(10,5); //构造一个容器 |
028 | //构造一个迭代器,并指向v1的第一个元素 |
029 | vector< int >::iterator iter1=v1.begin(); |
030 | //构造一个迭代器,并指向v1的第最后一个元素的下一个位置 |
031 | vector< int >::iterator iter2=v1.end(); |
032 | //这里要注意,.end()操作不是返回最后一个元素的位置 |
033 | //在迭代器里面,所有的范围都是一个左闭合区间,即: |
034 | // [迭代器起,迭代器止) 这对编程是很有利的,也是很安全的 |
035 | |
036 | |
037 | *iter1=0; // * 操作用来解引用,访问容器内的元素 |
038 | cout<<v1[0]<<endl; //这种操作和指针很像,但更安全 |
039 | cout<<*iter1<<endl; //这种操作可以作左值,也可以作右值 |
040 | //以上两句输出结果都为0 |
041 | |
042 | ++iter1; //支持前置++操作 |
043 | *iter1=1; |
044 | cout<<v1[1]<<endl; |
045 | cout<<*iter1<<endl; |
046 | //以上两句输出结果都为1 |
047 | |
048 | iter1++; //支持后置++操作 |
049 | *iter1=2; |
050 | cout<<v1[2]<<endl; |
051 | cout<<*iter1<<endl; |
052 | //以上两句输出结果都为2 |
053 | |
054 | --iter2; //支持前置--操作 |
055 | *iter2=9; |
056 | cout<<v1[9]<<endl; |
057 | cout<<*iter2<<endl; |
058 | //以上两句输出结果都为9 |
059 | //这也证明了.end()操作返回的是最后一个元素的下一个位置 |
060 | //而不是最后一个元素的位置 |
061 | |
062 | iter2--; //支持后置++操作 |
063 | *iter2=8; |
064 | cout<<v1[8]<<endl; |
065 | cout<<*iter2<<endl; |
066 | //以上两句输出结果都为8 |
067 | |
068 | if (iter1==iter2) //支持 == 操作 |
069 | cout<< "两个迭代器相等" <<endl; |
070 | else |
071 | cout<< "两个迭代器不相等" <<endl; |
072 | //以上输出结果为: 两个迭代器不相等 |
073 | |
074 | //支持 += 和 -= 操作 |
075 | iter1+=3; //从指向v1[2]改成指向v1[5] |
076 | iter2-=3; //从指向v1[8]改成指向v1[5] |
077 | |
078 | if (iter1!=iter2) //支持 != 操作 |
079 | cout<< "两个迭代器不相等" <<endl; |
080 | else |
081 | cout<< "两个迭代器相等" <<endl; |
082 | //以上输出结果为: 两个迭代器相等 |
083 | |
084 | //此外还支持的操作有: |
085 | // iter1+=iter2 |
086 | // iter1-=iter2 |
087 | |
088 | //另外对vector和deque还支持: |
089 | // iter1-iter2 |
090 | // iter1>iter2 |
091 | // iter1>=iter2 |
092 | // iter1<iter2 |
093 | // iter1<=iter2 |
094 |
095 | return 0; |
096 | } |
097 |
098 | //============================ |
099 | //运行结果: |
100 | //============================ |
101 | // 0 |
102 | // 0 |
103 | // 1 |
104 | // 1 |
105 | // 2 |
106 | // 2 |
107 | // 9 |
108 | // 9 |
109 | // 8 |
110 | // 8 |
111 | // 两个迭代器不相等 |
112 | // 两个迭代器相等 |
113 | //============================ |
114 |
115 | //============================ |
116 | //重点: |
117 | //============================ |
118 | //操作和概念和指什类似,但有不同 |
119 | //迭代器不是指针,两者不同的东西 |
120 | //迭代器的范围采用左闭合区间 [a,b) |
121 | //============================ |
122 | //下一节开始讲容器,会大量用到迭代器 |
123 | //因此,这里先讲迭代器。 |
124 | //============================ |