此文总结常用vector操作,是前一篇的续作!只有代码,详细请看代码中的注释。
[cpp] view plaincopy/*
* file_name: vector_test.cpp
*
* Created on: 2014年6月28日 下午3:34:23
* Author: The_Third_Wave,
* Last modified: 2014年6月28日 下午3:34:23
#include
#include
#include "Headers/Myfunc.h"
#include "Headers/Person.h"
void output(const std::vector &vec)
// 因为是输出而不是修改,定义形参为常量引用,提高可靠性(const)和效率(&)!
{
std::cout << "size: " << vec.size()<< ", capacity: " <
}
int main()
{
std::vector vec = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
pr_vector(vec);
// 访问首位元素,原生方法之vec.front()和vec.back() 使用前一般最好做元素检查vec.size()
std::cout << vec.front() << std::ends << vec.back() << std::endl;
// 通过迭代器【注意:*(--vec.end())】, 使用前一般最好做元素检查vec.size()
std::cout << *vec.begin() << std::ends << *(--vec.end()) << std::endl;
auto a = vec.size(); // 让编译器自动分析表达式所属类型
auto b = vec.capacity(); // 不重新分配内存的话,vector可以保存多少元素
std::cout << "size: " << a << std::ends << "capacity: " <
vec.reserve(50); // 分配至少能容纳n个元素的内存空间
output(vec);
vec.shrink_to_fit(); // 将capacity()减少为size()相同大小
output(vec);
vec.reserve(50); // 分配至少能容纳50个元素的内存空间
// 以下添加元素
for (decltype(vec.size()) ix = 0; ix != 40; ++ix) // decltype从表达式类型推导出变量类型
{
vec.push_back(ix*ix);
}
pr_vector(vec);
output(vec); // s输出证明没超过size,vector就不会分配超额的空间
// 我们不分配空间,看看自动管理
for (decltype(vec.size()) ix = 0; ix != 40; ++ix) // decltype从表达式类型推导出变量类型
{
vec.push_back(ix*ix);
}
pr_vector(vec);
output(vec); // 输出表示分配了超额的空间,【测试表明:分配的空间为当前的2倍,也就意味着越大越浪费】
// 以下重新初始化,开始插入操作的学习【并学习及几种赋值的操作方法】
std::vector vec2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // 重新初始化
pr_vector(vec); pr_vector(vec2);
std::swap(vec, vec2); // 【快速】交换两容器的数据 swap(a, b)
pr_vector(vec); pr_vector(vec2);
vec2.assign(vec.begin(), vec.end()); // 参数为另外一个同类型vector的迭代器
pr_vector(vec); pr_vector(vec2);
vec.assign({0, 0, 0, 0, 0}); // 参数为初始化列表
pr_vector(vec);
vec.assign(10, 1); // 替换为10个1
pr_vector(vec);
// vector没有向头部插入数据的原生方法,只能通过insert()方法来操作,插入位置都为指针指向的前一个位置
// 具体有4种
// 第一种vec.insert(p, t); p为自身的迭代器,t为需要插入的值,返回值为指向新添加元素的迭代器
auto p = vec.insert(vec.begin() + vec.size()/2, 6688);
// 第二种vec.insert(p, n, t); p为自身的迭代器,插入n个t,返回值为指向新添加的第一个元素的迭代器,如果n为0,则返回p
vec.insert(p, 3, 4);
// 第三种vec.insert(p, b, e); p为自身的迭代器,b、e为同类型其他vec对象的迭代器,返回值为指向新添加的第一个元素的迭代器。范围为空,则返回p
vec.insert(p, vec2.crbegin(), vec2.crend()); // const 反向迭代器
SAT答案 // 第四种vec.insert(p, il); p为自身的迭代器,il为元素值列表,返回值为指向新添加的第一个元素的迭代器,列表为空,则返回p
vec.insert(vec.begin(), {9,8,7,6,5,4,3,2,1,0});
pr_vector(vec);
// 善用使用insert返回值,可以实现特定位置的反复插入,以上结果已说明
托福答案 // emplace操作, 【c++11】emplace_front【vector没有】、emplace、emplace_back对应push_front【vector没有】、insert、push_back
std::vector per = {{"The_Third_Wave", 100, }}; // 类初始化+vector初始化,所以{{}, {}}必须的
per.emplace_back("The_Third_Wave", 188, );
per.emplace(per.begin() + 1, Person("The_Third_Wave", 168, ));
for (auto &p: per)
{
print(std::cout, p);
}
// 删除操作,注意编译器不检查元素是否存在,所以坑自己填
// vec.pop_back(),vector没有pop_front()
vec = {0, 1, 2, 3, 4, 5, 6, 7, 8 ,9};
vec.pop_back();
pr_vector(vec);
// vec.erase(p)【删除迭代器p所指元素,返回值为:被删元素之后的迭代器。p指向尾部,返回尾后迭代器,如果p是尾后迭代器,那就坑死你了,恭喜!】
vec.erase(vec.begin() + 8);
pr_vector(vec);
// vec.erase(b, e)【删除迭代器b,e所指范围元素,返回值为:被删元素之后的迭代器。如果e是尾后迭代器,返回的还是尾后迭代器,不坑,恭喜!】
vec.erase(vec.begin() + 3 , vec.end() - 1);
pr_vector(vec);
// vec.clear()删除所有,返回值为void
vec.clear();
pr_vector(vec);
std::cout << "上面有空行就对了!否则就是出错了。";
}
结果为:
[cpp] view plaincopy
0 1 2 3 4 5 6 7 8 9
0 9
0 9
size: 10 capacity: 10
size: 10, capacity: 50
size: 10, capacity: 10
0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521
size: 50, capacity: 50
0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521
size: 90, capacity: 100
0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0 4 4 4 6688 1 1 1 1 1
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7
0 1 2 7
上面有空行就对了!否则就是出错了。