vector的介紹
??vector是封裝動態(tài)數(shù)組的順序容器。
??就像數(shù)組一樣,vector也采用的連續(xù)存儲空間來存儲元素。這也就意味著我們可以通過下標(biāo)來獲取vector的元素,和數(shù)組一樣高效。但是又不像數(shù)組,vector的大小是可以動態(tài)改變的,且它的大小會被容器自動處理。
??本質(zhì)上,vector使用動態(tài)分配數(shù)組來存儲它的元素。當(dāng)新元素插入時,這個數(shù)組需要被重新分配大小,分配一個新的數(shù)組,然后將全部元素轉(zhuǎn)移到這個數(shù)組。就時間而言,是一個代價相對較高的任務(wù),因?yàn)槊慨?dāng)一個新的元素加入容器時,vector并不分每次都重新分配大小。
??vector空間分配策略:vector會分配一些額外的空間以適應(yīng)可能的增長,因?yàn)榇鎯臻g比實(shí)際需要的存儲空間更大。不同的庫采用不同的策略權(quán)衡空間的使用和重新分配。但是無論如何,重新分配都應(yīng)該是對數(shù)增長的間隔大小,以至于在末尾插入一個元素的時候是在常數(shù)時間的復(fù)雜度完成的。因此,vector占用了更多的存儲空間,為了獲得管理存儲空間的能力,并且以一種有效的方式動態(tài)增長。
??與其他動態(tài)序列容器相比,vector在訪問元素的時候更加高效,在末尾添加和刪除元素相對高效。對于其它不在末尾的刪除和插入,效率更低。
vector的使用
vector的定義
構(gòu)造函數(shù)聲明 | 接口說明 |
---|---|
vector() | 無參構(gòu)造 |
vector(size_type n, const value_type& val = value_type()) | 構(gòu)造并初始化n個val |
vector(const vector& x) | 拷貝構(gòu)造 |
vector(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type()) | 用迭代器進(jìn)行初始化構(gòu)造 |
int main()
{
vector<int> first;
vector<int> second(4, 100);
vector<int> third(second.begin(), second.end());
vector<int> fourth(third);
int myints[] = { 16, 2, 77, 29 };
vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));
cout << "The contents of fifth are:";
for (vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)
cout << ' ' << *it;
cout << '\n';
return 0;
}
vector初始化
初始化方法 | 說明 |
---|---|
vector<T> v1 | v1是一個空vector,它潛在的元素是T類型的,執(zhí)行默認(rèn)初始化 |
vector<T> v2(v1) | v2中包含有v1所有元素 |
vector<T> v2 = v1 | 等價于v2(v1) |
vector<T> v3(n, val) | v3包含了n個重復(fù)的元素,每個元素的值都是val |
vector<T> v4(n) | v4包含了n個重復(fù)地執(zhí)行了初始化的對象 |
vector<T> v5(a,b,c…) | v5包含了初始值個數(shù)的元素,每個元素被賦予響應(yīng)的初始值 |
vector<T> v5={a,b,c…} | 等價于 |
int main()
{
vector<int> v1;
vector<string> v2;
vector<vector<int>> v3; //這里相當(dāng)于二維數(shù)組int a[n][n];
vector<int> v4{ 1,2,3,4,5 };
vector<int> v5 = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括號
vector<string> v6 = { "hi","my","name","is","lee" };
vector<int> v7(5, -1); //初始化為-1,-1,-1,-1,-1。第一個參數(shù)是數(shù)目,第二個參數(shù)是要初始化的值
vector<string> v8(3, "hi");
vector<int> v9(10); //默認(rèn)初始化為0
vector<int> v10(4); //默認(rèn)初始化為空字符串
return 0;
}
vector iterator的使用
iterator的使用 | 接口說明 |
---|---|
begin+end | 獲取第一個數(shù)據(jù)位置的iterator/const_iterator,獲取最后一個數(shù)據(jù)的下一個位置的iterator/const_iterator |
rbegin+rend | 獲取最后一個數(shù)據(jù)位置的reverse_iterator,獲取第一個數(shù)據(jù)前一個位置的reverse_iterator |
int main()
{
vector<int> myvector{ 1, 2, 3, 4, 5 };
cout << *myvector.begin() << endl;
cout << *(myvector.end() - 1) << endl;
cout << *myvector.rbegin() << endl;
cout << *(myvector.rend() - 1) << endl;
return 0;
}
vector空間增長問題
容量空間 | 接口說明 |
---|---|
size | 獲取數(shù)據(jù)個數(shù) |
capacity | 獲取容量大小 |
empty | 判斷是否為空 |
resize | 改變vector的size |
reserve | 改變vector的capacity |
??capacity的代碼在vs和g++下分別運(yùn)行會發(fā)現(xiàn),vs下capacity是按1.5倍增長的,g++是按2倍增長的。vector具體增長多少是根據(jù)具體的需求定義的。vs是PJ版本的STL,g++是SGI版本的STL;
??reserve只負(fù)責(zé)開辟空間,如果確定知道需要用多少空間,reserve可以緩解vector增容的代價缺陷問題;
??resize在開空間的同時還會進(jìn)行初始化,影響size。
int main()
{
vector<int> myints;
cout << "0.size:" << myints.size() << endl;
for (int i = 0; i < 10; i++)
myints.push_back(i);
cout << "1.size:" << myints.size() << endl;
myints.insert(myints.end(), 10, 100);
cout << "2.size:" << myints.size() << endl;
myints.pop_back();
cout << "3.size:" << myints.size() << endl;
return 0;
}
int main()
{
vector<int> myvector;
for (int i = 0; i < 100; i++)
myvector.push_back(i);
cout << "size:" << (int)myvector.size() << endl;
cout << "capacity:" << (int)myvector.capacity() << endl;
cout << "max_size:" << (int)myvector.max_size() << endl;
return 0;
}
int main()
{
vector<int> myvector;
int sum(0);
for (int i = 1; i <= 10; i++)
myvector.push_back(i);
while (!myvector.empty())
{
sum += myvector.back();
myvector.pop_back();
}
cout << "total:" << sum << endl;
return 0;
}
int main()
{
vector<int> myvector;
for (int i = 1; i < 10; i++)
myvector.push_back(i);
cout << "0.size:" << myvector.size() << endl;
myvector.resize(5);
cout << "1.size:" << myvector.size() << endl;
myvector.resize(8, 100);
cout << "2.size:" << myvector.size() << endl;
myvector.resize(12);
cout << "3.size:" << myvector.size() << endl;
cout << "myvector contains:";
for (int i = 0; i < myvector.size(); i++)
cout << ' ' << myvector[i];
cout << endl;
return 0;
}
vector增刪改查
vector增刪改查 | 接口說明 |
---|---|
push_back | 尾插 |
pop_back | 尾刪 |
find | 查找(不是vector的成員接口) |
insert | 在position之前插入val |
erase | 刪除position位置的數(shù)據(jù) |
swap | 交換兩個vector的數(shù)據(jù)空間 |
operator[] | 想數(shù)組一樣訪問 |
int main()
{
vector<int> myvector;
for (int i = 1; i <= 10; i++)
myvector.push_back(i);
for (int i = 0; i < myvector.size(); i++)
cout << myvector[i] << ' ';
cout << endl;
for (int i = 0; i < 3; i++)
myvector.pop_back();
for (int i = 0; i < myvector.size(); i++)
cout << myvector[i] << ' ';
return 0;
}
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
vector<int>::iterator pos = find(v.begin(), v.end(), 2);
if (pos != v.end())
{
v.insert(pos, 20);
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
pos = find(v.begin(), v.end(), 2);
if (pos != v.end())
{
v.erase(pos);
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
v.erase(v.begin());
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
return 0;
}
int main()
{
vector<int> myvector;
for (int i = 1; i <= 10; i++)
myvector.push_back(i);
//刪除指定位置數(shù)據(jù)
myvector.erase(myvector.begin() + 5);
//刪除指定一個位置,到另一個位置間的所有數(shù)據(jù)
myvector.erase(myvector.begin(), myvector.begin() + 3);
cout << "myvector contains:";
for (unsigned i = 0; i < myvector.size(); i++)
cout << ' ' << myvector[i];
cout << endl;
return 0;
}
int main()
{
vector<int> foo(3, 100);
vector<int> bar(5, 200);
foo.swap(bar);
cout << "foo contains:";
for (unsigned i = 0; i < foo.size(); i++)
cout << ' ' << foo[i];
cout << endl;
cout << "bar contains:";
for (unsigned i = 0; i < bar.size(); i++)
cout << ' ' << bar[i];
cout << endl;
return 0;
}
文章來源:http://www.zghlxwxcb.cn/news/detail-423111.html
vector迭代器失效問題
??迭代器的主要作用就是讓算法能夠不用關(guān)心底層數(shù)據(jù)結(jié)構(gòu),其底層實(shí)際就是一個指針,或者是對指針進(jìn)行了封裝。因此迭代器失效,實(shí)際就是迭代器底層對應(yīng)的指針?biāo)赶虻目臻g被銷毀了,而使用一塊已經(jīng)被釋放的空間,造成的后果是程序崩潰。
對于vector可能會導(dǎo)致其迭代器失效的操作:文章來源地址http://www.zghlxwxcb.cn/news/detail-423111.html
- 會引起其底層空間改變的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等;
- 指定位置元素的刪除操作–erase;
- 注意:Linux下,g++編譯器對迭代器失效的檢測并不是非常嚴(yán)格,處理也沒有vs下極端。
到了這里,關(guān)于C++中的vector容器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!