直接初始化和拷贝初始化
string s1(10,'c');
string s2 = string(10,'c');//会影响性能!?
s1.size();//返回对象中字符的个数,类型为string::size_type,是无符号类型,不要与有符号类型混用
//范围 for
string str("Some String");
for(auto c : str)
{
cout << c << endl;
}
//引用每个元素
string str("All To Upper");
for(auto &c : str)
{
c = toupper(c);
}
cout<< str << endl;
使用下标访问空string会越界引发不可预知结果
无论何时用到字符串的下标,都应该注意检查其合法性.
列表初始化,尽可能把花括号内的值当成是元素初始值来处理,如果花括号提供的值不能用来列表初始化,则考虑构造函数等
在for等循环中,不要向容器中添加新元素,也不要改变容器的大小.在迭代中,某些对vector对象的操作会使迭代器失效.
iterator ite;
ite++;
--ite;
//不会越界?
ite + n;
ite - n;
int a[10];
decltype(a) b; 类型为10个元素的数组
标准库函数 begin end;end并非是数组的最后一个元素,而是最后一个元素的下一个位置.
ptrdiff_t size_t 都是带符号类型.
标准库限定使用的下标必须是无符号类型,数组可以是有符号的.
string.c_str()返回c风格字符串,无法保证此字符串一直有效,如果以后希望使用,应该重新拷贝一次.
decltype 多维数组 需要逐层解析 auto 也一样