第三章 : 字符串 , 向量 , 数组
名称空间 : [ 头文件中不包含using 的声明 ]
using namespce std;
std::cout
sting 类型:
构造 :
操作 :
I/O :
重载了 << >> 运算符
保留输入的空白使用 getline(istream , string) : 遇见换行符号结束
string::size_type : 体现与机器无关的特性 , 可以使用auto 和 decltype
遍历:
for(auto c : string)
[]
cctype针对字符的操作 :
vecotr<Type> : 可变长数组
注意事项: 不能存放引用类型。
构造: 列表初始化
添加元素:push_back(value) , insert [ 重载版本太多了 ]
其他操作:
迭代器介绍:
所有的标准容器都能使用迭代器 , 但是不是所有的标准容器都能使用 [ ]
认为一个类型是迭代器类型 , 当且仅当这个类型支持一套操作 , 这套操作能支持我们访问容器的元素或者从一个元素移动到另一个元素 , 每个容器定义一个名为 iterator 类型的。
- 迭代器提供了对元素的间接访问 , 类似指针 , 也分为有效 和 无效两种
- 正因为有运算符重载的这种机制 , 让标准库类型 更接近 内置类型 , 才会误让人认为迭代器类型像是指针
支持的运算: 后++也是可以的 :
失效问题 : 改变了容器的大小操作 , 可能导致失效 , [ 不要在循环改变容器的容量 ]
看博客 : https://www.cnblogs.com/newbeeyu/p/6883122.html
删除位置前面的迭代器 依然有效 删除位置后面的叠代器失效
vector<int> digits = {1,2,3,4,5,6}; auto ite_a = digits.begin(); auto ite_b = ite_a + 4; auto ite_c = digits .end(); digits.erase(ite_a + 2) //删除 ite_a+2 指向的元素后 , ite_a 依然的有效 , ite_b 失效 , ite_c 指向非法内存
数组:
指针和数组:
使用auto推断数组 会 退化成指针 :
decltype 推断 依然还是数组类型
指针也是迭代器 : 使用<iterator> 中的begin() 和 end()
指针运算:
指针相减得到的是一个 ptrdiff_t 类型的 , 在头文件 <cstddef> 头文件当中
C风格字符串 和 string
需要 string 的地方可以使用 C 风格字符串 , 因为 string(const char *) 是 非 explicit 的
需要 C 风格字符串的地方 string 可以使用 string.c_str() 返回一个 const char *
使用数组初始化 vector:
int a[] = {1,2,3,4,5} vector<int> digits(begin(a) , end(a))
现代C++ 要尽量使用 vector 和 迭代器 , 而不要使用 数组 和 指针类型