vector
标准库vector表示对象的集合,其中所有的对象类型都相同。有了vector就尽量不要用数组了。我在oj上做编程题时,用数组时就可能出现一些无法理解的错误,而仅仅把定义改成vector就完全没问题。
定义,初始化
vector<int> v1;
vector<vector<string>> file
;
vector<Node> t;
还可以为自定义类型变量。
常见:
vector<int> v;
for(int i=0;i!=100;++i){
v.push_back(i);
}
string word;
vector<string> text;
while(cin>>word){
text.push_back(word);
}
c++标准要求vector应该能在运行时高效地添加元素。
操作
熟悉增删查改。
-
v.empty()
判空 -
v.size()
查容器大小(元素个数) -
v[i]
可用下标访问元素 -
v1= v2
拷贝 -
v1== v2 v1!=v2
比较 -
v.begin()
返回指向容器第一个元素的迭代器 -
v.end()
返回指向容器最后一个元素的迭代器 -
增:插入元素
v.push_back(elem)
添加元素(在尾部追加一个元素)v.insert(iter_pos, elem) 在iteration position处插入一个元素elem
v.insert(iter_pos, m, elem) 在iterationposition处插入m个元素elem
eg:
v.insert(v.begin(), 666); 在最前面插入一个元素666
。
v.insert(v.begin()+i, 888); 在v[i]处插入一个元素(自然v[i]就让位),或者说在现在的v[i]前插入一个元素888;或者说,在第i个元素后面添加
-
删:
v.pop_back()
删除最后一个元素void pop_back ( );
注意只删除,并不返回元素
v.erase(iter_pos) 删除iter_pos处的元素
v.erase(beg, end) 删除区间**[beg, end)的元素,注意是右开区间,不包括end**
v.erase(v.begin()) 删除开头那个元素 ,或者说删除v[0]
v.erase(v.begin()+i) 删除v[i]
v.erase(v.begin()+i, v.begin()+j) 删除v[i]到v[j]的元素,不包括v[j]
v.clear() 移除容器中所有的元素。
例子
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
int elem;
cout<<"intput elements: ";
while(cin>>elem){
v.push_back(elem); //添加元素(末尾追加)
}
//原{2,4,6,8}
//判断容器空不空:
cout<<v.empty()<<endl;
cout<<"---------------"<<endl;
//insert插入元素:
cout<<"changing..... ";
//v.insert(v.begin(), 666);//在最前面插入666 ||结果:666 2 4 6 8
//v.insert(v.begin()+1, 666);//在第一个元素之后插入666/ 或者说,在v[1]前面插入元素666 ||结果:2 666 4 6 8
v.insert(v.begin()+1, 2, 666);// 在第一个元素之后插入 2个 666 ||结果:2 666 666 4 6 8
//erase删除元素:
v.erase(v.begin());//删除v[0]/ 或者说删除最前面的元素 ||结果:666 666 4 6 8
v.erase(v.begin(), v.begin()+2);//删除[v[0],v[2])区间的元素,注意是包括v[0],但不包括v[2] ||结果:4 6 8
cout<<"changed: ";
cout<<"the first elem:"<< v.front()<<" 等价于v[0]:"<<v[0]<<endl;
for(auto x: v){
cout<<x<<" ";
}
cout<<"大小: "<<v.size()<<endl;
//移除容器中所有元素:
v.clear();
cout<<"clear()后的容器大小: "<<v.size()<<endl;
cout<<"添加5个888后: ";
v.insert(v.begin(),5,888);
//可以采用下标遍历,推荐采用范围for
for(int i=0;i<int(v.size());++i){
cout<<v[i]<<" ";
}
cout<<"重设大小:大于原容器大小的,补0;小于原容器大小的,后面的就不要了"<<endl;
v.resize(10);
for(auto x: v){
cout<<x<<" "; //输出:888 888 888 888 888 0 0 0 0 0
}
return 0;
}
关于容器容量的变化,有兴趣的,可以看一下下面这个代码:
v.capacity()
容器容量
v.size()
容器里元素个数
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
cout<<"容器容量:"<<v.capacity()<<endl; //0
int elem;
cout<<"intput elements: ";
while(cin>>elem){
v.push_back(elem); //添加元素(末尾追加)
}
//原{2,4,6,8}
cout<<"容器容量:"<<v.capacity()<<endl; //4
//判断容器空不空:
cout<<v.empty()<<endl;
cout<<"---------------"<<endl;
//insert插入元素:
cout<<"changing..... ";
//v.insert(v.begin(), 666);//在最前面插入666 ||结果:666 2 4 6 8
//v.insert(v.begin()+1, 666);//在第一个元素之后插入666/ 或者说,在v[1]前面插入元素666 ||结果:2 666 4 6 8
v.insert(v.begin()+1, 2, 666);// 在第一个元素之后插入 2个 666 ||结果:2 666 666 4 6 8
cout<<"容器容量:"<<v.capacity()<<endl; //8 这个时候元素6个,容器容量增长为8了
//erase删除元素:
v.erase(v.begin());//删除v[0]/ 或者说删除最前面的元素 ||结果:666 666 4 6 8
v.erase(v.begin(), v.begin()+2);//删除[v[0],v[2])区间的元素,注意是包括v[0],但不包括v[2] ||结果:4 6 8
cout<<"changed: ";
cout<<"the first elem:"<< v.front()<<" 等价于v[0]:"<<v[0]<<endl;
for(auto x: v){
cout<<x<<" ";
}
cout<<"大小: "<<v.size()<<endl;
//移除容器中所有元素:
v.clear();
cout<<"clear()后的容器大小: "<<v.size()<<endl;//0
cout<<"容器容量:"<<v.capacity()<<endl;//仍然为8
cout<<"添加5个888后: ";
v.insert(v.begin(),5,888);
//可以采用下标遍历,推荐采用范围for
for(int i=0;i<int(v.size());++i){
cout<<v[i]<<" ";
}
cout<<"容器容量:"<<v.capacity()<<endl; //8
cout<<"重设大小:大于原容器大小的,补0;小于原容器大小的,后面的就不要了"<<endl;
v.resize(10);
for(auto x: v){
cout<<x<<" "; //输出:888 888 888 888 888 0 0 0 0 0
}
cout<<"容器容量:"<<v.capacity()<<endl; //10 容量在增长
return 0;
}