1)cbegin 和 cend
原来的begin和end返回的iterator是否是常量取决于对应的容器类型,但是有时,即使容器不是常量类型,我们也希望获得一个const_iterator,以避免不必要的修改行为。C++11新标准中提供了cbegin和cend函数,无论容器类型,都固定返回const_iterator。
vector<int> c1 = {
0, 1, 2, 3, 4};
auto it1_1 = c1.begin();
auto it1_2 = c1.cbegin();
*it1_1 = 4;
//*it1_2 = 5; // wrong, const iterator's value can't be changed via this iterator.
cout<<*it1_1<<'\t'<<*it1_2<<endl;
2)标准库的 begin 和 end
C++11新标准提供了begin和end函数,可以对普通数组使用,获得头指针和尾指针。
int c2[] = {
0, 1, 2, 3, 4};
auto it2_1 = begin(c2);
auto it2_2 = end(c2);
while(it2_1 != it2_2)
{
cout<<*it2_1<<'\t';
it2_1++;
}
3)新的赋值方式
C++11允许使用一个{}包围的初始值列表来进行复制。如果等号左侧是个容器,那么怎么赋值由容器决定。
vector<int> c3;
c3 = {
0, 1, 2, 3, 4};
for(auto it3_1 = c3.begin(); it3_1 != c3.end(); it3_1++)
cout<<*it3_1<<'\t';
cout<<endl;
4)initializer_list
C++11新标准中新增了initializer_list类型,其实在之前介绍初始化的那篇文章中,使用vector v = {0, 1, 2, 3, 4}这种初始化形式时,就隐式的使用了initializer_list:每当在程序中出现一段以{}包围的字面量时,就会自动构造一个initializer_list对象。另外,initializer_list的另一个作用就在于作为函数的形参,这样的函数可以方便的传入以{}包围的不定长列表:
void print_list(initializer_list<int> il)
{
for(