先总结一些,等以后碰到了再增加。
1.vector(动态数组)
1.动态扩展,增加长度,动态数组
2.数组内数据通常存储在栈上,而vector<int> 中数据存储在堆上。
动态扩展:
像水杯装水一样,如果容量不足以承载水,那么换一个更大的杯子(不同的更大空间),再将原来的水装进去更大容量杯子。
动态扩展并不是在原空间之后续接新空间,而是找到比原来更大的内存空间,将原数据拷贝到新空间,释放原空间。
2.vector形象图
3.vector的构造函数
代码
#include<bits/stdc++.h>
using namespace std;
int main () {
// 默认构造函数
vector<int> v;
puts("请输入五个数字,中间空格相隔:");
for(int i = 0; i < 5; i ++) {
int x; cin >> x;
v.push_back(x);
}
puts("默认构造v :"); for(auto x:v) cout << x <<" ";
cout << endl;
// 拷贝构造函数
vector<int> v1(v.begin(),v.end());
vector<int> v2(v1.rbegin(),v1.rend());
puts("拷贝构造v1 :");
for(auto x:v1) cout << x << " "; cout << endl;
puts("逆序:拷贝构造v2 :");
for(auto x:v2) cout << x << " "; cout << endl;
//n个elem拷贝
vector<int> v3(3,5);
puts("n个elem拷贝:v3 :");
for(auto x:v3) cout << x << " "; cout << endl;
// 拷贝构造函数
vector<int> v4(v2);
puts("拷贝构造v4 :");
for(auto x:v4) cout << x << " "; cout << endl;
return 0;
}
1) vector<int> V;
默认构造函数 vector<int> v;
2) vector(v.begin(),v.end())
将区间v.begin(),v.end(); 部分拷贝给本身。
vector<int> v2(v1.begin(), v2.end() )
vector<int> v2(v1.rbegin(),v2.rend() )
3) vector(n,elem)
将n个elem拷贝给本身
vector<int> v3(5,5)
将5个5拷贝给v3本身
4) vector(const vector &v)
拷贝构造函数
vector<int> v4(v3)
将v3拷贝给v4
迭代器(可以理解为指针)
vector<int>::iterator it = v.begin();
vector<int>::iterator it = v3.begin();
cout << *it;
4.vector的赋值操作
代码
#include<bits/stdc++.h>
using namespace std;
int main () {
// 重载赋值运算符
vector<int> v(5,2);
vector<int> v1 = v;
puts("v :");
for(auto x:v) cout << x << " "; puts("");
puts("重载赋值运算符 = v1:");
for(auto x:v1) cout << x << " "; puts("");
//assign 区间赋值
vector<int> v2(5,5);
puts("v2 :");
for(auto x:v2) cout << x << " "; puts("");
v.assign(v2.begin(),v2.begin()+2);
puts("v2区间赋值v :");
for(auto x:v) cout << x << " "; puts("");
//assign 赋值n个elem
v.assign(1,5);
puts("1个5, v:");
for(auto x:v) cout << x << " "; puts("");
return 0;
}
1.vector & operator = (const vector &v)
重载赋值运算符
v2 = v1
2.assign(v.begin(),v.end() )
assign 整片区间都会被覆盖掉
将区间v.begin(),v.end(),值赋值给本身
v3.assign(v1.begin(),v1.end())
3.assign(n,elem)
assign 整片区间都会被覆盖掉
v4.assign(5.9)
5.vector的容量和大小
代码
#include<bits/stdc++.h>
using namespace std;
int main () {
vector<int> v;
puts("v.capacity()");
cout << v.capacity() << endl;
puts("v.empty()");
cout << v.empty() << endl;
puts("v.size() :");
cout << v.size() << endl;
puts("resize(5,1)后:");
int n = 5;
v.resize(n,1);
puts("v.capacity()");
cout << v.capacity() << endl;
puts("v.empty()");
cout << v.empty() << endl;
puts("v.size() :");
cout << v.size() << endl;
puts("输出v:");
for(auto x:v) cout << x << " "; puts("");
return 0;
}
1.empty()
判断容器是否为空,为空返回1,否则返回0.
v1.empty();
2.capacity();
返回容器容量,如果size将会超过这个容量就需要重新分配新空间,恢复原数据增加新数据
v1.capacity();
3.size();
返回容器大小,即容器中元素个数
v1.size();
4.resize(int num);
重新指定容器的长度为num,
若容器变长,以默认值0填充新位置。
若容器变短,则末尾超过容器长度的元素被删除
v.resize(5); int num = 4; v.resize(num);
5.resize(int num, int elem);
v.resize(5, 0)
与resize(int num)相同
resize动态扩展,大于容量,重新分配。
变长则以elem填充,
小于就仍旧使用原先空间,
相当于加水和倒水,杯子容量不够,换被子。
6.vector的插入和删除
代码
#include<bits/stdc++.h>
using namespace std;
int main () {
vector<int> v;
puts("输入5个数字:");
for(int i = 0; i < 5; i ++) {
int x; cin >> x;
v.push_back(x);
}
puts("输出v:");
for(auto x:v) cout << x << " "; puts("");
puts("删除最后一个元素:并输出v:");
v.pop_back();
for(auto x:v) cout << x << " "; puts("");
puts("在第一个位置插入 99 并输出v:");
v.insert(v.begin(),99);
for(auto x:v) cout << x << " "; puts("");
puts("在最后一个位置插入3个20,并输出v:");
v.insert(v.end(),3,20);
for(auto x:v) cout << x << " "; puts("");
puts("删除第二个元素,并输出v:");
v.erase(v.begin()+1);
for(auto x:v) cout << x << " "; puts("");
puts("删除开头两个元素,并输出v:");
v.erase(v.begin(),v.begin()+2);
for(auto x:v) cout << x << " "; puts("");
puts("清空容器,并输出v.empty():");
cout << v.empty() << endl;
return 0;
}
1.push_back(ele);
尾部插入元素ele
v.push_back(ele);
2.pop_back();
删除最后一个元素
v.pop_back();
3.insert(const_iterator pos, ele);
在迭代器返回的位置pos处插入一个元素 ele
v.insert(v1.begin(),20);
4.insert(const_iterator pos, int count, ele);
在迭代器返回的位置pos处插入count个元素ele
v.insert(v1.end(),3,20);
5.erase(const_iterator pos)
删除迭代器指向的元素
v.erase(v.begin() );
6.erase(const_iterator begin, const_iterator end);
删除迭代器从begin到end的元素
v.erase(v.begin(),v.end() );
7.clear();
清空,删除容器中所有元素
v.clear()
7.vector互换容器
代码
#include<bits/stdc++.h>
using namespace std;
int main () {
vector<int> v;
puts("输入5个数字:");
for(int i = 0; i < 5; i ++) {
int x; cin >> x;
v.push_back(x);
}
vector<int> v1(5,2);
puts("互换前,输出v和v1:");
puts("v :");
for(auto x:v) cout << x << " "; puts("");
puts("v1:");
for(auto x:v1) cout << x << " "; puts("");
puts("互换后");
v.swap(v1);
puts("v :");
for(auto x:v) cout << x << " "; puts("");
puts("v1:");
for(auto x:v1) cout << x << " "; puts("");
return 0;
}
1.swap(v)
容器v与当前容器互换
v1.swap(v)
8.vector 数据存取
代码
#include<bits/stdc++.h>
using namespace std;
int main () {
vector<int> v;
puts("输入5个数字:");
for(int i = 0; i < 5; i ++) {
int x; cin >> x;
v.push_back(x);
}
puts("输出v: ");
for(auto x:v) cout << x << " "; puts("");
int idx = 0;
puts("v.at(idx)输出idx指向数据:");
cout << "idx:" << idx << " " << v.at(idx++) << endl;
puts("operator[]索引所指向数据v[idx]: ");
cout << "idx:" << idx << " " << v[idx++] << endl;
puts("front()");
cout << v.front() << endl;
puts("back()");
cout << v.back() << endl;
return 0;
}
1.at(int idx)
返回索引idx所指的数据
v.at(i)
2.operator[]
返回[]内索所指数据
v[i]
3.front()
返回容器中第一个元素
v.front();
4.back()
返回容器中最后一个元素
v.back()
9.vector 预存空间 reserve
预存后里边是随机值,未预存不能取值
v2.reserve(1000)
代码
#include<bits/stdc++.h>
using namespace std;
int main () {
vector<int> v;
puts("未预存前不能输出 v.back()");
v.reserve(1000);
puts("预存后,v.back()是一个随机值:");
cout << v.back() << endl;
puts("v 容量:");
cout << v.capacity() << endl;
puts("");
puts("构造时直接初始化1000个空间,默认值为0");
vector<int> v1(1000);
puts("vector<int> v1(1000) 的back值");
cout << v1.back() << endl;
puts("v1容量:");
cout << v.capacity() << endl;
puts("");
puts("构造时直接初始化1000个空间为1");
vector<int> v2(1000,1);
puts("vector<int> v2(1000,1) 的back值");
cout << v2.back() << endl;
puts("v1容量:");
cout << v.capacity() << endl;
return 0;
}