C++ 随记

来源:互联网 发布:php curl 获取请求头 编辑:程序博客网 时间:2024/06/03 21:40

范围for(range for)语句

C++11新标准:

操作表示一个序列的对象中的每个基础元素——对序列中的每个基础元素执行相同的某种操作。因此对string对象可以使用。

若要在范围for语句中改变基础元素的值,必须将循环变量定义成引用类型。

const和vector

const vector<int> c_ivec(10,1);  ...........................(1)
vector <const int> ivec(10,1);  .......................(2)
上述两句都可以编译通过。
vector为类模板,必须进行实例化才能成为容器类型。
(1)的容器类型为 vector<int>,因此c_ivec从右向左,类型为vector<int>,const限定变量c_ivec,即是限定容器c_ivec不能被改变,所以const的vector是固定的,只读的,因此不能对c_ivec进行修改容器的任何操作(包括push_back操作和对容器元素赋值的操作)。
(2)的容器类型为vector <const int>,即容器ivec的类型为vector <const int>,元素类型为const int。

C++ Primer上有这么一段:
C++ 语言中,大多数类型都可用作容器的元素类型。容器元素类型必须满足以下两个约束:
元素类型必须支持赋值运算。
元素类型的对象必须可以复制。
因此实际上vector <const int> ivec(10,1);中ivec这样的容器是不存在的。

但是!!!vs2010中:
#include<iostream>#include<vector>#include<string>using namespace std;void main (){vector<const int> ivec(10,1);for(int i=0;i!=ivec.size();i++)cout<<ivec[i]<<" ";cout<<endl;int j=5;ivec.push_back(j);ivec[9]=10;for(int i=0;i!=ivec.size();i++)cout<<ivec[i]<<" ";cout<<endl;}
编译通过,并且输出结果:

?????????????
0 0
原创粉丝点击