Vector
vector是一个动态数组,当你在指定大小后,插入的数据数量大于你指定的内存那么它会找一个更大的内存而不是在后面继续扩展,然后将原本数组和你插入的数据放入新的内存最后释放原本的数据内存。
输出
void PrintVector(vector<int>v) {
for (vector<int>::iterator it = v.begin();it != v.end();it++) {
cout << *it<<" ";
}
cout << endl;
}
构造方法
id test01() {
vector<int> v;//无参构造
for (int i = 0;i < 10;i++) {
v.push_back(i);
}
PrintVector(v);
//通过区间方式进行构造
vector<int>v2(v.begin(), v.end());
PrintVector(v2);
//n个elem方式构造
vector<int>v3(10,100);
PrintVector(v3);
//拷贝构造
vector<int>v4(v3);
PrintVector(v4);
}
vector 赋值
void test02() {
vector<int> v;
for (int i = 0;i < 10;i++) {
v.push_back(i);
}
vector<int>v2;
v2 = v;
PrintVector(v2);
//assign方法
vector<int>v3;
v3.assign(v.begin(), v.end());
PrintVector(v3);
vector<int>v4;
//利用n个elem上面的是初始化这里是赋值哈
v4.assign(10, 100);
}
vector的容量和大小
void test03() {
vector<int> v;
for (int i = 0;i < 10;i++) {
v.push_back(i);
}
if (v.empty()) {
//如果为空输出1
cout << 1<<endl;
}
else {
//不为空输出0
cout << 0;
}
//这里输出的是13 因为已经插入了10个数而一般底层找的内存空间是会比你实际存入的数据要大点的
cout << v.capacity()<<endl;//v的容量
cout << v.size()<<endl;//v的大小,这里输出的是10
v.resize(15);//重新指定大小
PrintVector(v);//这里打印v会有15个数组,因为容器里只有10个数字后面没有的会用0填充
v.resize(17,100);//重载,可以替换填充的数字
PrintVector(v);//最后的二个数组是100
v.resize(5);//比原本短 会截断
PrintVector(v);
}
vector 插入和删除
void test04() {
vector<int> v;
for (int i = 0;i < 10;i++) {
v.push_back(i);//尾插
}
v.pop_back();//尾删
v.insert(v.begin(), 100);//在迭代器位置插入100 第一个参数是迭代器
v.insert(v.begin(), 2, 1000);// 重载 插n个数组在指定迭代器位置
v.erase(v.begin());//删除 删除迭代器位置的数据
v.erase(v.begin(), v.end());//重载 删除一个区间 这里就类似清空
v.clear();//清空
}
vector 数据存取
void test05() {
vector<int> v;
for (int i = 0;i < 10;i++) {
v.push_back(i);
}
//利用[]访问元素
for (int i = 0;i < 10;i++) {
cout << v[i]<<" ";
}
//利用at函数访问元素
for (int i = 0;i < 10;i++) {
cout << v.at(i) << " ";
}
//返回第一个元素
cout << v.front() << endl;
//返回最后一个元素
cout << v.back() << endl;
}
vector互换容器
1、基本使用
void test06() {
vector<int> v;
for (int i = 0;i < 10;i++) {
v.push_back(i);
}
vector<int> v2;
for (int i = 10;i >0;i--) {
v2.push_back(i);
}
//交换前
PrintVector(v);
PrintVector(v2);
//交换二个容器内的数据
v.swap(v2);
//交换后
PrintVector(v);
PrintVector(v2);
}
swap 实际用途
巧用swap收缩内存空间
void test07() {
vector<int> v;
for (int i = 0;i < 100000;i++) {
v.push_back(i);
}
//打印大小和容量
cout << v.size() << endl;//100000
cout << v.capacity() << endl;//138255
//重新指定大小
v.resize(3);
//打印大小和容量
cout << v.size() << endl;//3
cout << v.capacity() << endl;//138255
//这里虽然重新指定了大小,但容量却没有变,而我们只操作的内存大小为3却给了我们138255的内存大小,浪费内存资源
//利用swap收缩内存空间
vector<int>(v).swap(v);
/*
这里创建一个匿名函数,用vector的拷贝构造函数来初始化它vector<int>(v),
而这里的x的大小和容量会按v的所用内存大小为这个匿名对象初始化,也就是大小容量都是3
假设这里的匿名函数在内存中叫x,这里可以吧x,v都理解为一个指向内存空间的指针,
那么交换x与v的指向的内存空间,最后匿名函数执行完毕,系统回收x的内存空间
*/
cout << v.size() << endl;//3
cout << v.capacity() << endl;//3
}
vector预留空间
void test08() {
int* p;
int num = 0;
vector<int> v;
for (int i = 0;i < 100000;i++) {
v.push_back(i);
if (p != &v[0]) {
p = &v[0];//如果p不指向v的首地址,那么就让它指向
num++;//用来指定储存1000个数需要进行多少次的动态内存扩展
}
}
//如果提前知道要存储100000个数据那么就可以直接预留空间
vector<int> v2;
v2.reserve(100000);
for (int i = 0;i < 100000;i++) {
v2.push_back(i);
if (p != &v2[0]) {
p = &v2[0];
num++;
}
}
//这样只有一次
}