001 | /*- ========================================================== |
002 | * 文件名 :STL_con_ite_4.cpp |
003 | * 开发人员:袁培荣 |
004 | * 当前版本:1.0.0.2595 |
005 | * 创建时间:2012-05-23 |
006 | * 修改时间:2012-05-23 |
007 | * 功能说明:STL 容器和迭代器连载4_顺序容器的操作1 |
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> |
017 | #include <list> |
018 | #include <deque> |
019 | #include <string> |
020 |
021 | using std::cout; |
022 | using std::endl; |
023 | using std::vector; |
024 | using std::list; |
025 | using std::deque; |
026 | using std::string; |
027 |
028 | int main( int argc, char * argv[]) |
029 | { |
030 | //在讲顺序容器的操作前,补充一个知识点: |
031 | //那就是容器的容器的定义: |
032 | vector<vector< int > > con1; |
033 | vector<list<string> > con2; |
034 | list<list< int > > con3; |
035 | list<vector<string> > con4; |
036 | vector<list<deque< int > > > con5; |
037 | //相信你也已经看明白了,无非就是一种嵌套,唯一要注意的是: |
038 | //两个">"符号之间一定要有空格,不然编译器会误认为">>"。 |
039 | |
040 | //一般,容器都为自己定义了一些数据类型,如: |
041 | // (在STL vector 介绍连载1-2-3中使用过一些) |
042 | // size_type 无符号的整型,用来存储此容器类型的最大可能容器长度 |
043 | // iterator 容器的迭代器类型 |
044 | // ……其他不一一介绍 |
045 | |
046 | //下面来介绍第一组操作,也是我们前面用过的 |
047 | // begin() 返回一个迭代器,指向容器的第一个元素 |
048 | // end() 返回一个迭代器,指向容器的最后一个元素的下一位置 |
049 | // 以上两个的返回类型是iterator或者const_iterator |
050 | // rbegin() 返回一个逆序迭代器,指向容器的最后一个元素 |
051 | // rend() 返回一个逆序迭代器,指向容器的第一个元素的前一个位置 |
052 | // 以上两个的返回类型是reverse_iterator或者const_reverse_iterator |
053 | //下面是一个示例: |
054 | vector< int > v1(10,0); //创建一个容器,有10元素,每个都初始化为0 |
055 | cout<< "为便于区分每个元素,下面重设每个元素的值" <<endl; |
056 | for ( int i=0; i!=10; i++) |
057 | { |
058 | v1[i]=i; |
059 | cout<< "重设v1[" <<i<< "]的值为" <<i<<endl; |
060 | } |
061 | //下面就用迭代器来访问 |
062 | //先设定四个迭代器来接收上面的四种操作的返回值 |
063 | vector< int >::iterator iter1=v1.begin(); //指向v1[0] |
064 | vector< int >::iterator iter2=v1.end(); //指向v1[9]的下一个位置 |
065 | vector< int >::reverse_iterator iter3=v1.rbegin(); //指向v1[9] |
066 | vector< int >::reverse_iterator iter4=v1.rend(); //指向v1[0]的前一个位置 |
067 | //通过输出来验证 |
068 | cout<< "iter1指向元素的值为:" <<*iter1<<endl; |
069 | cout<< "iter2-1指向元素的值为:" <<*(iter2-1)<<endl; |
070 | cout<< "iter3指向元素的值为:" <<*iter3<<endl; |
071 | cout<< "iter4-1指向元素的值为:" <<*(iter4-1)<<endl; |
072 | //这里读者可能用有疑问:iter4指向v1[0]的前一个位置, |
073 | //那么要访问下一个位置,也不是v1[0],应该是加1,而不是减1啊。 |
074 | //其实,对于逆序迭代器,加代表前移,减代表后移,刚好和迭代器相反 |
075 | |
076 | //为了更进一步说明,我们用迭代器和逆序迭代器来分别输出容器的每一个元素 |
077 | cout<< "用迭代器来输出容器的每一个元素" <<endl; |
078 | for (vector< int >::iterator iter=v1.begin(); |
079 | iter!=v1.end(); iter++) //加代表后移 |
080 | cout<<*iter<< " " ; |
081 | cout<<endl; |
082 | cout<< "用逆序迭代器来输出容器的每一个元素" <<endl; |
083 | for (vector< int >::reverse_iterator riter=v1.rbegin(); |
084 | riter!=v1.rend(); riter++) //加代表前移 |
085 | cout<<*riter<< " " ; |
086 | //这里我们明白了,原来逆序迭代器的加法意义和迭代器相反 |
087 | //是为了让 ++ 来遍历迭代器和逆序迭代器的方法通用。 |
088 | |
089 | return 0; |
090 | } |
091 |
092 |
093 | //============================ |
094 | //运行结果: |
095 | //============================ |
096 | // 为便于区分每个元素,下面重设每个元素的值 |
097 | // 重设v1[0]的值为0 |
098 | // 重设v1[1]的值为1 |
099 | // 重设v1[2]的值为2 |
100 | // 重设v1[3]的值为3 |
101 | // 重设v1[4]的值为4 |
102 | // 重设v1[5]的值为5 |
103 | // 重设v1[6]的值为6 |
104 | // 重设v1[7]的值为7 |
105 | // 重设v1[8]的值为8 |
106 | // 重设v1[9]的值为9 |
107 | // iter1指向元素的值为:0 |
108 | // iter2-1指向元素的值为:9 |
109 | // iter3指向元素的值为:9 |
110 | // iter4-1指向元素的值为:0 |
111 | // 用迭代器来输出容器的每一个元素 |
112 | // 0 1 2 3 4 5 6 7 8 9 |
113 | // 用逆序迭代器来输出容器的每一个元素 |
114 | // 9 8 7 6 5 4 3 2 1 0 |
115 | //============================ |