vector容器
vector基本概念
功能:
-
vector数据结构和数组非常相似,也称为单端数组
vector与普通数组区别:
-
不同之处在于数组是静态空间,而vector可以动态扩展
动态扩展
-
并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数拷贝新空间,释放原空间
vector 容器的操作(表格)
函数 vector<int>v; | 意义 | 使用 |
---|---|---|
v.begin() | 迭代器指向第一个元素 | |
v.end() | 迭代器指向最后一个元素的下一个位置 | |
v.rbegin() | 指向倒数第一个元素 | |
v.rend() | 指向第一个元素的前一个 | |
v.push_back(ele) | 尾插法插数,尾部插入元素ele | v.push_back(存入数据);当数组//尾插法输出正 |
v.pop_back() | 尾删法删除数,删除最后一个元素 | |
v.insert(const_iterator pos,ele) | 头插法,迭代器指向位置pos插入元素ele | v.insert(v.begin,存入数据);//头插法输出反 |
v.insert(const_iterator pos ,int count,ele) | 迭代器指向位置pos插入count个元素ele | x.insert(x.begin(),存入量,存入数据); |
v.erase(const_iterator pos) | 删除迭代器指向的元素 | v.erase(v.begin());//因为是begin所以是头删 |
v.erase(const_iterator start,const_iterator end) | 删除迭代器从start到end之间的元素 | v.erase(v.begin(),v.end());//删除全部,任何区间左闭右开 v.erase((2+x.begin()),(v.end()-5));头尾自己操作函数帮忙删中间 |
v.clear(); | 删除容器中所有元素 | v.clear();清空 |
vector<类型>c;c=a; | 将a赋值给c | vector<int>c; c=a; |
x.assign(入容器名.begin(),入容器名.end()) | 将传入容器赋值给调用容器 | vector<int>d;d.assign(c.begin(),d.end()); |
x.assign(个数,内容) | 内容个 个数给调用 | vector<int>e;e.assign(10,100); |
empty(); | 判断容器是否为空 | e.empty();为空返回真,不为空返回假; |
capacity(); | 容器的容量 | e.capacity; 容器的容量 |
size(); | 返回容器中元素的个数 | e.size();容器中存放的数据的量 |
resize(int num); | 1.重新指定容器的长度为num若容器变长,则默认值填充新位置2.如果容器变短,则末尾超出容器长度的元素被删除 | e.resize(新的容量大小);不够补0,超出删除 |
resize(int num,elem); | 1.重新指定容器的长度为num,若容器变长,则以elem值填充新位置2.如果容器变短,则末尾超出容器长度的元素被删除 | e.resize(新的容量大小,补充的内容);不够补 补充的内容,超出删除 |
v.front() | 返回容器中第一个数据元素 | cout<<"第一个元素为"<<a.front() << endl; |
v.back() | 返回容器中最后一个数据元素 | cout << "最后一个元素为" << a.back() << endl; |
v.at(int idx) | 返回索引idx所指的数据 | for (int i = 0; i < a.size(); i++) { cout << a[i] << " " << endl; } |
operator[]; | 返回索引idx所指的数据 | for (int i = 0; i < v.size(); i++) { cout << v[i] << " " << endl; }v |
swap(vec) | 将vec与本身的元素互换 | a.swap(b);a容器对象可以和b容器对象存储数据量不同 |
vector<int>(a).swap(a); | //收缩内存 | 创建一个匿名vector对象 通过a来初始化匿名对象 之后匿名对象与原对象交换 交换完匿名对象离开当前行被立即销毁 |
reserve(int len); | 容器预留len个元素长度,预留位置不初始化,元素不可访问 | v.reserve(预留空间); 让其只开辟一次空间 |
-
vector容器的迭代器是支持随机访问的迭代器
vector构造函数
功能描述
-
创建vector容器
vector容器构造
#include<iostream>
#include<vector>
using namespace std;
vector<int>v1;
void funs(vector<int>&v)
{
for(vector<int>::iterator it=v.begin;it!=it.end();it++)
{
cout<<*it<<endl;
}
}
int main()
{
vector<int>b;
funs(b);
vector<int>c; //默认构造无参构造
for(int i=0;i<10;i++)
{
c.push_back(i);
}
//通过区间方式进行构造
printVector(c);
vector<int>d(c.begin(),c.end());//将迭代器中数据传入
printvector(d);//数据赋值
//n个elem方式构造
vector<int>e(10,100);//10个100
printvector(e);
//拷贝构造
vector<int>f(e);
printvector(f);
system("pause");
return 0;
}
vector赋值操作
功能描述:给vector容器进行赋值
#include<iostream>
#include<vector>
using namespace std;
void test()
{
vector<int>a;
for(int i=0;i<10;i++)
{
a.push_back(i);
}
vector<int>b;
b=a;
vector<int>c;
c.assign(10,c);
vector<int>d;
d.assign(d.begin(),d.end());
}
int main(){}
vector容量和大小
功能描述:
-
对vector容器的容量和大小操作
#include<iostream>
#include<vector>
using namespace std;
void printvector(vector<int>&x)
{
for(vector<int>::iteratorit=x.begin();it!=x.end(),it++)
{
cout<<*it<<endl;
}
}
int main()
{
vector<int>a;
for(int i=0;i<10;i++)
{
int b;
cout<<"输入数字"<<endl;
cin>>b;
a.push_back(b);
}
if(a.empty()==1) //如果为真代表容器为空
{
cout<<"容器为空"<<endl;
}
else
{
printvector(a);
cout<<"容器的容量为"<<a.capacity()<<endl;
cout<<"容器中存放数据数为"<<a.size()<<endl;
}
a.resize(15);
printvector(a);
a.resize(17,10);不够自动补10
system("pause");
return 0;
}
vector插入和删除
功能描述: 对vector容器进行插入删除操作
#include<iostream>
#include<vector>
using namespace std;
void printvector(vector<int>&a)
{
for(vector<int>::iterator it=a.begin();it!=a.end();it++)
{
cout<<*it<<endl;
}
}
int main()
{
vector<int>a;
int b;
cout<<"输入打算插入元素个数"<<endl;
cin>>b;
for(int i=0;i<b;i++)
{
int c;
cout<<"输入要插入的数字"<<endl;
cin>>c;
a.push_back(c);
}
printvector(a);
vector<int>x;
int d;
cout<<"输入打算插入元素个数"<<endl;
cin>>d;
for(int m=0;m<d;m++)
{
int j;
cout<<"输入要存人的数字"<<endl;
cin>>j;
x.insert(x.begin(),j);//插入的j第一个的位置变成了begin
}
printvector(x);
int g;
int r;
cout<<"输入要插入的元素量"<<endl;
cin>>g;
r=g;
g=d+g;
x.resize(g); //先扩大
for(i=d;i<g;i++)
{
int y;
cout<<"输入要插入的数字"<<endl;
cin>>y;
x.insert(x.begin(),r,y);
}
printvector(x);
x.erase(x.begin());//删除头的一个
x.erase(x.begin(),x.end());//删除全部
x.clear();//清空
system("pause");
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
void printvector(vector<int>& a)
{
for (vector<int>::iterator it = a.begin(); it != a.end(); it++)
{
cout << *it <<" " ;
}
}
int main()
{
vector<int>a;
int b;
cout << "输入打算插入元素个数" << endl;
cin >> b;
for (int i = 0; i < b; i++)
{
int c;
cout << "输入要插入的数字" << endl;
cin >> c;
a.push_back(c);
}
printvector(a);
cout << endl;
vector<int>x;
int d;
cout << "输入打算插入元素个数" << endl;
cin >> d;
for (int m = 0; m < d; m++)
{
int j;
cout << "输入要存人的数字" << endl;
cin >> j;
x.insert(x.begin(), j);//插入的j第一个的位置变成了begin
}
printvector(x);
cout << endl;
x.erase((2+x.begin()),(x.end()-5));
printvector(x);
system("pause");
return 0;
} //修改了部分的让操作输出什么更好看还有一些上面没有的调用删除的部分
vector数据存取
功能描述
-
对vector数据的存取操作
#include<iostream>
#include<vector>
using namespace std;
void printvector(vector<int>& a)
{
for (vector<int>::iterator it = a.begin(); it != a.end(); it++)
{
cout << *it << " " << endl;
}
}
void printvector2(vector<int>& a)
{
for (int i = 0; i < a.size(); i++)
{
cout << a[i] << " " << endl;
}
}
void printvector3(vector<int>& a)
{
for (int i = 0; i < a.size(); i++)
{
cout << a.at(i) << " ";
}
}
int main()
{
vector<int>a;
int b;
cout << "输入要存入几个整数" << endl;
cin >> b;
for (int i = 0; i < b; i++)
{
int t;
cout << "输入要存入的数字" << endl;
cin >> t;
a.insert(a.begin(), t);
}
printvector2(a);
printvector3(a);
system("pause");
cout<<"第一个元素为"<<a.front() << endl;
cout << "最后一个元素为" << a.back() << endl;
return 0;
}
vector互换容器
功能描述:
-
实现两个容器内元素进行互换
#include<iostream>
#include<vector>
using namespace std;
void printvector(vector<int>&a)
{
int b;
cout << "选择调用循环方式3种" << endl;
cin >> b;
switch (b)
{
case 1:
{
for (vector<int>::iterator it = a.begin(); it != a.end(); it++)
{
cout << *it << endl;
}
}break;
case 2:
{
for (int i = 0; i < a.size(); i++)
{
cout << a[i] << endl;
}
}break;
case 3:
{
for (int i = 0; i < a.size(); i++)
{
cout << a.at(i) << endl;
}
}break;
}
}
int main()
{
vector<int>a;
int d;
cout << "输入要存入多少个数" << endl;
cin >> d;
for (int i = 0; i < d; i++)
{
int t;
cout << "输入要存入的数字" << endl;
cin >> t;
//a.insert((a.begin()-1),t); //逆转版头插法-》尾插法 输入一个数之后报错
a.insert(a.begin(), t);
}
vector<int>b;
int e;
cout << "输入要存入多少个数" << endl;
cin >> e;
for (int i = 0; i < e; i++)
{
int t;
cout << "输入要存入的数字" << endl;
cin >> t;
//a.insert((a.begin()-1),t); //逆转版头插法-》尾插法 输入一个数之后报错
b.insert(b.begin(), t);
}
printvector(a);
printvector(b);
a.swap(b);//数据量不同也可以换
printvector(a);
printvector(b);
system("pause");
vector<int>(a).swap(a);//收缩内存 创建一个匿名vector对象 通过a来初始化匿名对象 之后匿名对象与原对象交换 交换完匿名对象离开当前行被立即销毁
return 0;
}
vector预留空间
功能:
-
减少vector在动态扩展容量时的扩展次数
#include<iostream>
#include<vector>
using namespace std;
void printvector(vector<int>& a)
{
for (vector<int>::iterator it = a.begin(); it != a.end(); it++)
{
cout << *it << " " << endl;
}
}
void printvector2(vector<int>& a)
{
for (int i = 0; i < a.size(); i++)
{
cout << a[i] << " " << endl;
}
}
void printvector3(vector<int>& a)
{
for (int i = 0; i < a.size(); i++)
{
cout << a.at(i) << " ";
}
}
int main()
{
vector<int>a;
int b;
cout << "输入要存入几个整数" << endl;
cin >> b;
for (int i = 0; i < b; i++)
{
int t;
cout << "输入要存入的数字" << endl;
cin >> t;
a.insert(a.begin(), t);
}
printvector2(a);
printvector3(a);
system("pause");
cout<<"第一个元素为"<<a.front() << endl;
cout << "最后一个元素为" << a.back() << endl;
vector<int>g;
g.reserve(15); //预留空间
int num=0;//统计开辟次数(搬家次数)
int* p = NULL;
for (int i = 0; i < 10; i++)
{
g.insert(g.begin(), i);
if (p != &g[0])
{
p = &g[0];
num++;
}
}
return 0;
}
如果你真的因为这段影片而感动,那么唯一不用做的事就是原谅奥托。 你可以记恨他,因为他视生命为草芥,因为他伤害了一个个我们心爱的女武神。 你可以同情他,因为他爱而不得,注定无法与那个他愿付出一切来换回的爱人重逢。 你可以佩服他,因为他可以真正做到不择手段,把自己当成达成自己目的的最大工具。 你可以可怜他,因为他人渣的一生中还有他唯一心爱的孙女,却只能让她永远记恨他。 你可以怜悯他,因为他亲手将自己逼进绝路,亲手造就了成为众矢之的愚者——伪神奥托。 在他漫长而又短暂的五百年生命中,很多事只有他能想出来,很多事也只有他能做出来。在最后,他需要的不是正名,因为那是他自己都不愿赐给自己的东西。如果说世界上存在一个最恨伪神奥托的人,那个人一定是前天命主教、卡莲的大发明家,奥托 阿波卡利斯。 奥托需要的不是洗白,是纯黑,是独自沉沦的黑,是将所有人排斥在外的黑。如果奥托在最后一刻被原谅,被理解,那么他过去的一切都被否定了,不管是他做过的好事还是坏事,都失去了它们之所以发生的意义。 奥托的离开需要的不是“走好”或“安息”,可能他仅仅只是需要旁人心中,哪怕那么一瞬的对生命的脆弱和逝去而感到的悲悯。因为那才是奥托成为恶人,成为愚者,成为伪神的原因。 其他人的逝去,我们可以说一句“永别了,老朋友。”,至于奥托,不如就送他一句“永别了,老逼登。”