C++STL之vector向量容器
阿新 • • 發佈:2019-01-21
++i 反向 規則 push_back 初始化 調整 har algorithm 大小 vector向量容器
vector向量容器不但能向數組一樣對元素進行隨機訪問, 還能在尾部插入元素
vector具有內存自動管理的功能, 對於元素的插入和刪除, 可動態調整所占的內存空間
vector容器的下標是從0開始計數的, 也就是說, 如果vector容器的大小是n, 那麽, 元素的下標是0~n-1
對於vector容器的容量定義, 可以事先定義一個固定的大小, 事後, 可以隨時調整其大小;
也可以事先不定義, 隨時使用push_back()方法從尾部擴張元素, 也可以使用insert()在某個元素位置前插入新元素
vector容器有兩個重要的方法, begin()和end().
begin()返回的是首元素位置的叠代器
end()返回的是最後一個元素的下一個元素位置的叠代器
1.1創建vector對象
(1)不指定容器的元素個數, 如定義一個用來存儲整型的容器:
vector<int> v;
(2)創建時, 指定容器的大小, 如定義一個用來存儲10個double類型元素的向量容器
vector<double> v(10);
註意, 元素的下標為0~9; 另外, 每個元素的值被初始化為0.0
(3)創建一個具有n個元素的向量容器對象, 每個元素具有指定的初始值:
vector<double> v(10, 8.6)
上述語句定義了v向量容器, 共有10個元素, 每個元素的值是8.6
1.2尾部元素擴張
尾部追加元素, vector容器會自動分配新內存空間, 可對空的vector對象擴張, 也可對已有元素的vector對象擴張
下面代碼將2,7,9三個元素從尾部添加到v容器中, 這樣, v容器中就有了三個元素, 其值依次是2,7,9
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;
v.push_back(2);
v.push_back(7);
v.push_back(9);
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
1.3下標方式訪問vector元素
對於vector對象, 可以采用下標方式隨意訪問它的某個元素, 當然, 也可以以下標的方式對某元素重新賦值, 這點類似於數組的訪問方式
下面的代碼就是采用下標方式對數組賦值, 再輸出元素的值2,7,9:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(3);
v[0] = 2;
v[1] = 7;
v[2] = 9;
cout << v[0] << " " << v[1] << " " << v[2] << endl;
return 0;
}
1.4用叠代器訪問vector元素
常使用叠代器配合循環語句來對vector對象進行遍歷訪問, 叠代器的類型一定要與它要遍歷的vector對象的元素類型一致
下面的代碼采用叠代器對vector進行了遍歷, 輸出2,7,9:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(3);
v[0] = 2;
v[1] = 7;
v[2] = 9;
//定義叠代器變量
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); it++)
{
//輸出叠代器上的元素值
cout << *it << " ";
}
cout << endl;
return 0;
}
1.5元素的插入
insert()方法可以在vector對象的任意位置前插入一個新的元素, 同時, vector自動擴張一個元素空間, 插入位置後的所有元素依次向後挪動一個位置
要註意的是, insert()方法要求插入的位置, 是元素的叠代器位置, 而不是元素的下標
下面的代碼輸出結果是: 8,2,1,7,9,3:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(3);
v[0] = 2;
v[1] = 7;
v[2] = 9;
//在最前面插入新元素, 元素值為8
v.insert(v.begin(), 8);
//在第2個元素前面插入新元素1
v.insert(v.begin() + 2, 1);
//在向量末尾追加新元素3
v.insert(v.end(), 3);
//定義叠代器變量
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); it++)
{
//輸出叠代器上的元素值
cout << *it << " ";
}
cout << endl;
return 0;
}
1.6元素的刪除
erase()方法可以刪除vector中叠代器所指的一個元素或一段區間中的所有元素
clear()方法則可以一次性刪除vector中的所有元素
下面這段代碼演示了vector元素的刪除方法:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(10);
//給向量賦值
for(int i = 0; i < 10; i++)
{
v[i] = i;
}
//刪除2號元素, 從0開始計數
v.erase(v.begin() + 2);
//定義叠代器變量
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); it++)
{
//輸出叠代器上的元素值
cout << *it << " ";
}
cout << endl;
//清空向量
v.clear();
//輸出向量大小
cout << v.size() << endl;
return 0;
}
1.7使用reverse反向排列算法
reverse 反向排列算法, 需要定義頭文件"#include<algorithm>", 可將向量中某段叠代器區間元素反向排列, 看下面這段代碼:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v(10);
//給向量賦值
for(int i = 0; i < 10; ++i)
{
v[i] = i;
}
//反向排列向量的從首到尾的元素
reverse(v.begin(), v.end());
//定義叠代器變量
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); it++)
{
//輸出叠代器上的元素值
cout << *it << " ";
}
cout << endl;
return 0;
}
1.8使用sort算法對向量元素排序
使用sort算法, 需要聲明"include<algorithm>"頭文件
sort算法要求使用隨機訪問叠代器進行排序, 在默認的情況下, 對向量元素進行升序排列, 下面這個程序很好的說明了sort算法的使用方法:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v;
int i;
//賦值
for(i = 0; i < 10; ++i)
{
v.push_back(9 - i);
}
//輸出排序前的元素值
for(i = 0; i < 10; ++i)
{
cout << v[i] << " ";
}
cout << endl;
//排序, 升序排列
sort(v.begin(), v.end());
//輸出排序後的元素值
for(i = 0; i < 10; ++i)
{
cout << v[i] << " ";
}
cout << endl;
return 0;
}
還可以自己設定排序比較函數, 然後, 把這個函數指定給sort算法, 那麽, sort就根據這個比較函數指定的排序規則進行排序, 下面的程序自己設計了一個排序比較函數Comp, 要求對元素的值由大到小排序:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//自己設計的排序比較函數, 對元素的值進行降序排列
bool Comp(const int &a, const int &b)
{
if(a != b)
return a > b;
else
return a > b;
}
int main()
{
vector<int> v;
int i;
for(i = 0; i < 10; ++i)
{
v.push_back(i);
}
for(i = 0; i < 10; ++i)
{
cout << v[i] << " ";
}
cout << endl;
sort(v.begin(), v.end(), Comp);
for(i = 0; i < 10; ++i)
{
cout << v[i] << " ";
}
cout << endl;
return 0;
}
1.9向量的大小
使用size()方法可以返回相連的大小, 即元素的個數
使用empty()方法可以返回向量是否為空
下面這段代碼演示了size()方法和empty()方法的用法:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v(10);
for(int i = 0; i < 10; ++i)
{
v[i] = i;
}
cout << v.size() << endl; //元素的個數
cout << v.empty() << endl; //非空為0
v.clear();
cout << v.empty() << endl; //空為1
return 0;
}
/*
10
0
1
*/
另外, 向量的類型可以是int, double, char等簡單類型, 也可以是結構體或string基本字符序列容器, 使用起來非常靈活.
C++STL之vector向量容器