vector
vector是C++标准库中定义的一个类模版,它可以实现类似数组的功能。
std::vector<int> x;
与内建数组相比,vector更侧重于易用性而不是性能。比如vector是可以复制的,比如
std::vector<int> x;
std::vector<int> y;
y = x;
同时,它也支持在运行期动态改变大小,比如
std::vector<int> x; // 在初始化时候尺寸不定
vector的性能要比内建的数组相差很多
vector的初始化可以使用以下方法
- 缺省初始化
- 聚合初始化
std::vector<int> x = {1,2,3};
- 其他的初始化方式,具体的可以参考这里
std::vector<int> x(3); // 包含三个元素,其中的每个元素都为0 std::vector<int> x(3,1); // 包含三个元素,其中的每个元素都为1 std::vector<int> x{3,1}; // 包含2个元素,值为3,1
vector提供了一系列的方法:
- 获取元素个素
std::vector<int> x(3); x.size(); // 返回3
- 判断其是否为空
std::vector<int> x(3); x.empty();
- 插入、删除元素
std::vector<int> x(3); x.push_back(1); // 插入 x.pop_back(1); // 删除
- 比较
std::vector<int> x1(3); std::vector<int> x2(2); x1 == x2; // 按顺序逐个比较 x1 > x2; // 按顺序逐个比较,若元素相同尺寸不同,则按照元素个数大小来判断
我们可以对vector中的元素进行索引和遍历
- 取值类型
std::vector<int> x1(3); x1[2]; // 出现越界可能会出现段错误 x1.at(2); // 出现越界在运行时会报详细的错误
- 指针类型
std::vector<int> x(3); std::cbegin(x); std::cend(x); std::begin(x); std::end(x);
- 迭代器类型:迭代器是用来模拟指针的行为,包含多种类别,每种类别支持的行为不同,vector对应的是随机访问迭代器,它支持以下行为
- 解引用与下标访问
std::vector<int> x(3); auto b = x.begin(); *b; b[1];
- 移动
std::vector<int> x(3); auto b = x.begin(); b = b+1; b = b -1;;
- 两个迭代器相减求范围
std::vector<int> x(3); x.end() - x.begin();
- 两个迭代器相互比较
两个迭代器必须指向相同的容器
- 解引用与下标访问
- 基于范围的for循环
关于vector还有一些其他的内容需要了解:
- 向vector中添加元素可能会使得迭代器失效
- 可以构造多维vector
std::vector<std::vector<int>> x{{1,2,3},{1,2}}; // 每一维包含的元素不相同 x.push_back(std::vector<int>()); x[0].push_back(1);
*
与->
std::vector<int> x; x.size(); std::vector<int> * ptr = &x; x->size();
对于指针来说
ptr->
等价于`(*ptr).- vector内部也会定义一些类型,比如
size_type
:size
方法的返回值类型iterator
/const iterator
- 其他参见这里
string
string是C++标准库中定义的一个类模版特化别名,用做内建字符串的代替品
std::string x = "Hello world";
与内建的字符串相比,vec更加侧重于易用性,它可以复制,也可以在运行期动态改变字符个数,但同时牺牲了性能,比如
std::string x = "Hello world";
std::string y = x;
y = y + "!";
string有很多构造和初始化方法,具体的可以参考这里
除了构造和初始化方法,string还支持很多其他的方法
- 尺寸相关的方法(
size
/empty
) - 比较
- 赋值
- 拼接
- 索引
std::string x = "Hello world"; x[0]; // H
- 转换为C风格字符串
std::string x = "Hello world"; auto y = x.c_str(); // 返回类型为 const char *