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;
}