vector 是向量類型猜绣,它可以容納許多類型的數(shù)據(jù),如若干個(gè)整數(shù)敬特,所以稱其為容器掰邢。它相當(dāng)于一個(gè)動(dòng)態(tài)的數(shù)組,當(dāng)程序員無法知道自己需要的數(shù)組的規(guī)模多大時(shí),用其來解決問題可以達(dá)到最大節(jié)約空間的目的。
構(gòu)造vector對(duì)象
vector 是C++ STL的一個(gè)重要成員伟阔,使用它時(shí)需要包含頭文件: #include<vector>
vector<int> a; //無參數(shù) - 構(gòu)造一個(gè)空的vector,
vector<int> a(10); //定義了10個(gè)整型元素的向量(尖括號(hào)中為元素類型名辣之,它可以是任何合法的數(shù)據(jù)類型),但沒有給出初值皱炉,其值是不確定的怀估。
vector<int> a(10,1); //定義了10個(gè)整型元素的向量,且給出每個(gè)元素的初值為1
vector<int> a(b); //用b向量來創(chuàng)建a向量,整體復(fù)制性賦值合搅, 拷貝構(gòu)造
vector<int> v3=a ; //移動(dòng)構(gòu)造
vector<int> a(b.begin(),b.begin+3); //定義了a值為b中第0個(gè)到第2個(gè)(共3個(gè))元素
int b[7]={1,2,3,4,5,9,8};
vector<int> a(b,b+6); //從數(shù)組中獲得初值多搀,b[0]~b[5]
基本操作-屬性獲取/調(diào)整
1 vec.empty-判斷vec是否為空
a.empty()
2 vec.size-元素的個(gè)數(shù)
a.size()
3 vec.capacity-實(shí)際存儲(chǔ)空間
a.capacity()
4 vec.resize-調(diào)整大小
a.resize(10); //將a的現(xiàn)有元素個(gè)數(shù)調(diào)至10個(gè),多則刪灾部,少則補(bǔ)康铭,其值隨機(jī)
a.resize(10, 2); //將a的現(xiàn)有元素個(gè)數(shù)調(diào)至10個(gè),多則刪赌髓,少則補(bǔ)从藤,其值為2
5 vec.reserve-重新分配空間
a.reserve(100); //將a的容量(capacity)擴(kuò)充至100,也就是說現(xiàn)在測(cè)試a.capacity();的時(shí)候返回值是100.這種操作只有在需要給a添加大量數(shù)據(jù)的時(shí)候才顯得有意義锁蠕,因?yàn)檫@將避免內(nèi)存多次容量擴(kuò)充操作(當(dāng)a的容量不足時(shí)電腦會(huì)自動(dòng)擴(kuò)容夷野,當(dāng)然這必然降低性能),但是最大值不可以大于max_size的值匿沛,否則會(huì)拋出異常
6 比較操作符
a==b; //b為向量扫责,向量的比較操作還有!=,>=,<=,>,<
基本操作-增加元素
1 vec.push_back()-尾部插入元素
在容器的最后一個(gè)位置插入元素x,如果size值大于capacity值榛鼎,則將重新分配空間
函數(shù):
void push_back (const value_type& val);
void push_back (value_type&& val);
// vector::push_back
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
int myint;
std::cout << "Please enter some integers (enter 0 to end):\n";
do {
std::cin >> myint;
myvector.push_back (myint);
} while (myint);
std::cout << "myvector stores " << int(myvector.size()) << " numbers.\n";
return 0;
}
2 vec.insert()-插入元素
第一個(gè)函數(shù)逃呼,在迭代器指定的位置前插入值為x的元素
第二個(gè)函數(shù),在迭代器指定的位置前插入n個(gè)值為x的元素
第三個(gè)函數(shù)者娱,在迭代器指定的位置前插入另外一個(gè)容器的一段序列迭代器first到last
若插入新的元素后總得元素個(gè)數(shù)大于capacity抡笼,則重新分配空間
a.insert(a.begin()+1, 5); //在a的第1個(gè)元素(從第0個(gè)算起)的位置插入數(shù)值5,如a為1,2,3,4黄鳍,插入元素后為1,5,2,3,4
a.insert(a.begin()+1, 3,5); //在a的第1個(gè)元素(從第0個(gè)算起)的位置插入3個(gè)數(shù)推姻,其值都為5
a.insert(a.begin()+1,b+3, b+6); //b為數(shù)組,在a的第1個(gè)元素(從第0個(gè)算起)的位置插入b的第3個(gè)元素到第5個(gè)元素(不包括b+6)框沟,如b為1,2,3,4,5,9,8藏古,插入元素后為1,4,5,9,2,3,4,5,9,8
// inserting into a vector
#include <iostream>
#include <vector>
int main()
{
std::vector<int> myvector(3, 100);
std::vector<int>::iterator it;
it = myvector.begin();
it = myvector.insert(it, 200);
myvector.insert(it, 2, 300);
// "it" no longer valid, get a new one:
it = myvector.begin();
std::vector<int> anothervector(2, 400);
myvector.insert(it + 2, anothervector.begin(), anothervector.end());
int myarray[] = { 501,502,503 };
myvector.insert(myvector.begin(), myarray, myarray + 3);
std::cout << "myvector contains:";
for (it = myvector.begin(); it < myvector.end(); it++)
std::cout << ' ' << *it;
std::cout << '\n';
system("PAUSE");
return 0;
}
基本操作-刪除元素
1 vec.erase-刪除
iterator erase (const_iterator position);//刪除指定位置元素增炭,返回迭代器
//例如:a.erase(a.begin()+1)
iterator erase (const_iterator first, const_iterator last);//刪除指定迭代器中間的元素,左閉右開
//例如:a.erase(a.begin()+1, a.begin()+3);
2 vec.clear-清空vec中的元素
將容器里的內(nèi)容清空拧晕,size值為0隙姿,但是存儲(chǔ)空間沒有改變
a.clear();
3 vec.pop_back-刪除尾部元素
a.pop_back(); //刪除a向量的最后一個(gè)元素
基本操作-查找/修改元素
1 vec.assign-重新賦值
將丟棄原來的元素然后重新分配元素,第一個(gè)函數(shù)是使用迭代器厂捞,第二個(gè)函數(shù)是使用4個(gè)元素输玷,每個(gè)元素的值為2
a.assign(b.begin(), b.begin()+3); //b為向量,將b的0~2個(gè)元素構(gòu)成的向量賦給a
a.assign(4,2); //是a只含4個(gè)元素靡馁,且每個(gè)元素為2
2 vec.back-返回vec的最后一個(gè)元素
返回尾部元素的值欲鹏,與end()函數(shù)有區(qū)別,back()函數(shù)返回的是尾部元素的迭代器
vec.back()
3 vec.front-返回vec的第一個(gè)元素
返回第一個(gè)元素的值臭墨,與begin()函數(shù)有區(qū)別赔嚎,begin()函數(shù)返回的是第一個(gè)元素的迭代器
vec.front()
4 vec[i]-下標(biāo)訪問修改
// vector::operator[]
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector (10); // 10 zero-initialized elements
std::vector<int>::size_type sz = myvector.size();
// assign some values:
for (unsigned i=0; i<sz; i++) myvector[i]=i;
// reverse vector using operator[]:
for (unsigned i=0; i<sz/2; i++)
{
int temp;
temp = myvector[sz-1-i];
myvector[sz-1-i]=myvector[i];
myvector[i]=temp;
}
std::cout << "myvector contains:";
for (unsigned i=0; i<sz; i++)
std::cout << ' ' << myvector[i];
std::cout << '\n';
return 0;
}
5 at-訪問元素
在函數(shù)的操作方面和下標(biāo)訪問元素一樣,不同的是當(dāng)這個(gè)函數(shù)越界時(shí)會(huì)拋出一個(gè)異常out_of_range
// vector::at
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector (10); // 10 zero-initialized ints
// assign some values:
for (unsigned i=0; i<myvector.size(); i++)
myvector.at(i)=i;
std::cout << "myvector contains:";
for (unsigned i=0; i<myvector.size(); i++)
std::cout << ' ' << myvector.at(i);
std::cout << '\n';
return 0;
}
6 swap-交換
交換這兩個(gè)容器的內(nèi)容裙犹,這涉及到存儲(chǔ)空間的重新分配
// swap vectors
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> foo (3,100); // three ints with a value of 100
std::vector<int> bar (5,200); // five ints with a value of 200
foo.swap(bar);
std::cout << "foo contains:";
for (unsigned i=0; i<foo.size(); i++)
std::cout << ' ' << foo[i];
std::cout << '\n';
std::cout << "bar contains:";
for (unsigned i=0; i<bar.size(); i++)
std::cout << ' ' << bar[i];
std::cout << '\n';
return 0;
}
基本操作-迭代器
1 vec.begin/vec.end-迭代器
// vector::begin/end
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
for (int i=1; i<=5; i++) myvector.push_back(i);
std::cout << "myvector contains:";
for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
2 vec.cbegin/vec.cend-常量迭代器
返回一個(gè)類型為cont::const_iterator 的對(duì)象
// vector::cbegin/cend
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector = {10,20,30,40,50};
std::cout << "myvector contains:";
for (auto it = myvector.cbegin(); it != myvector.cend(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
算法操作
需要頭文件#include<algorithm>
1 sort-排序
sort(a.begin(),a.end()); //對(duì)a中的從a.begin()(包括它)到a.end()(不包括它)的元素進(jìn)行從小到大排列
2 reverse-翻轉(zhuǎn)
使用reverse將元素翻轉(zhuǎn)
reverse(a.begin(),a.end()); //對(duì)a中的從a.begin()(包括它)到a.end()(不包括它)的元素倒置尽狠,但不排列,如a中元素為1,3,2,4,倒置后為4,2,3,1
3 copy-復(fù)制
copy(a.begin(),a.end(),b.begin()+1); //把a(bǔ)中的從a.begin()(包括它)到a.end()(不包括它)的元素復(fù)制到b中叶圃,從b.begin()+1的位置(包括它)開 始復(fù)制袄膏,覆蓋掉原有元素
4 find-查找
find(a.begin(),a.end(),10); //在a中的從a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置
常用操作
使用迭代器遍歷容器
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++){
vec[it]=0;
}
auto遍歷
for (auto& x : vec)
std::cout << ' ' << x;