C++ 中 vector 的基本操作及使用注意事项
1. 基本操作
1.1 初始化
// 括号
std::vector<int> a (5); //0,0,0,0,0
std::vector<int> b (5,1); //1,1,1,1,1
// 花括号
std::vector<int> c = {1,2,3,4,5,6};
std::vector<int> c {1,2,3,4,5,6}; // 和上面的写法等价
1.2 赋值
std::vector<int> foo (3,0);
std::vector<int> bar (5,0);
bar = foo; //Copies all the elements from foo into the bar.
1.3 内存
vector的内存也是连续的,可以和数组切换。
- 动态扩容
std::vector<int> a;
for (int i = 0; i < 1000; ++i)
{
a.push_back(i);
std::cout << "size: " << a.size() << " capacity: " << a.capacity() << std::endl;
}
- reserve
std::vector<int> a;
a.reserve(1000); // size: 0 capacity: 1000
扩充:
reserve 和 resize 的区别?
resize 会调用构造函数,而 reserve 仅仅是开辟内存空间。直观的表现就是 resize 会改变 vector size 的值(此时 capacity 也可能会改变),而 reserve 改变的是 capacity。
vector<int> a(100, 1};
vector<int> b;
b.resize(100); // 这里如果是 reserve 会出错
std::copy(a.begin(), a.begin() + step, b.begin());
1.4 增
// insert 在指定位置之前插入指定数量的值
// 插入的过程中可能会造成realloc,这时 it 失效
std::vector<int> a = {1,2,3,4,5,6};
a.reserve(10); // 注意这里开辟了capcity,插入不会 realloc, it 不会失效,仍然指向 begin 位置
std::vector<int>::iterator it = a.begin();
a.insert(it, 1); // a = {1,1,2,3,4,5,6}
a.insert(it, 3, 2); // a = {2,2,2,1,1,2,3,4,5