c++ Primer 第五版 第87页
初始化vector的几种方法
vector<T> v1;
vector<T> v2(v1);
vector<T> v2 = v1
vector<T> v3(n,val) //v3包含了n个重复的元素,元素值为val
vector<T> v4(n) // v4包含了n个重复执行了初始化的对象
vector<T> v5{a,b,c...}
vector<T> v5={a,b,c...}
注意初始元素值列表初始化只能使用花括号 不能使用圆括号
由于花括号和圆括号在初始化中都有,所以一定要注意,使用不同的括号,圆括号代表数量,花括号代表初值
也就是说,圆括号是用来构造的,花括号是用来列表初始化的
特别地
如果初始化用的是花括号,但是提供的值又不能用来初始化,就要考虑用其进行构造
vector<string> v5{"hi"};//列表初始化
vector<string> v6("hi");//错误:不能用字符串构造
vector<string> v7{10};//10不能初始化string,因此生成10个string默认对象
vector<string> v8{10, "hi"};//10不能初始化string,因此生成10个hi
当然还是不建议上面这种容易混淆的方式进行
c++ Primer 第五版 第91页
随着对vector的使用,有很多隐含要求,其中一条就是
范围for语句体内不应改变其所遍历序列的大小
因为这样你边改边遍历,遍历的语句执行结果和预期会有差异
c++ Primer 第五版 第92页
要使用size_type 需先指定它对应的类型
vector<int>::size_type//正确
vector::size_type//错误
c++ Primer 第五版 第96页 迭代器
迭代器解引用的操作类似于指针
for (auto it=s.begin();it != s.end() && !isspace(*it); ++it)
*it = toupper(*it);//
一般来说 我们不知道迭代器的类型也不重要,不过那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型
为了便于得到const_iterator ,c++ 11标准提供了cbegin和cend函数,这样无论vector或者string对象是否是常量,都会返回const_iterator
迭代器可以和一个整数相加减,使其向后前移动
两个迭代器也可以相减,返回他们之间的距离,其类型是difference_type,带符号
迭代器之间也可以相互比较,反映其位置关系