STL之vector常用方法 二維vector 取vector陣列指標
阿新 • • 發佈:2019-01-11
一.使用包含
#include <vector>
using namespace std;
二.宣告
1、一維陣列:
vector<int> a;
vector<int> a(100, 0); //宣告長度為100值為0的vector
vector<int> a(b.begin()+1, b.end()-2);
2、動態建立m*n的二維vector:
方法一:
vector<vector<int> > arr; (注意<int>後有空格或者使用typedef定義)
arr.resize(m);
for (int i=0;i<m;i++) arr[i].resize(n);
方法二:
vector<vector <int> > arr(m,vector<int>(n,0)); //初始化為0,m*n大小
C++版:
int **p=new int*[m];
for(int i=0; i<m; i++)
p[i]=new int[n];
3、初始化:
int v1[10] = {0,0,0,0,0,0};
vector<int> v(&v1[0],&v1[6]);
copy(v.begin(), &v1[0 ], &v1[6]);
三.增
push_back() 在陣列的最後新增一個數據,可以使單個數據或者陣列。如果在宣告時沒有定義長度,則直接用下表賦值會出錯需用push_back。
b.push_back(10);
insert(pos,elem) 在pos位置插入一個elem拷貝
b.insert(a.begin(),10); //在開頭位置插入,stl插入機制一般是在當前位置的前面插入
b.insert(a.end(),10); //在結尾位置插入
assign(),對vector進行批量賦值
v1 = 10 20 30 40 50
v2 = 1 2
v2 = v1 // v2 = 10 20 30 40 50
v2.assign(v1.begin(), v1.end()); // v2 = 10 20 30 40 50
v3.assign(3, 3) ; // v3 = 3 3 3
emplace 插入值,類似於insert
std::vector<int> myvector = {10,20,30};
auto it = myvector.emplace ( myvector.begin()+1, 100 ); // 在1位置插入100
myvector.emplace ( it, 200 ); //在100位置插入200
myvector.emplace ( myvector.end(), 300 ); // 在結尾插入300
結果 :myvector contains: 10 200 100 20 30 300
emplace_back (100) 類似於push_back()
四.刪
pop_back() 去掉陣列的最後一個數據
myvector.push_back (100);
myvector.push_back (200);
while (!myvector.empty())
{
sum+=myvector.back();
myvector.pop_back();
}
erase() 刪除指標指向的資料項,iterator
clear() 清空當前的vector
五.改
insert(pos,elem) 在pos位置插入一個elem拷貝
b.insert(a.begin(),10); //在開頭位置插入,stl插入機制一般是在當前位置的前面插入
b.insert(b.end(),b.begin(),b.end()); //在結尾位置插入vector b
六.查
a[5]
at() 得到index位置的資料
begin() 得到陣列頭的指標
end() 得到陣列的最後一個單元+1的指標
rbegin() 將vector反轉後的開始指標返回
rend() 將vector反轉後的結束指標返回
front() 得到陣列頭的引用
back() 得到陣列的最後一個單元的引用
myvector.push_back(78);
myvector.push_back(16);
// now front equals 78, and back 16
myvector.front() -= myvector.back();
max_size() 得到vector最大可以是多大
capacity() 當前vector分配的大小
size() 當前使用資料的大小
empty() 判斷vector是否為空
vector<int>::iterator it = find( li.begin( ), li.end( ), c ); //遍歷查詢c
if(iter != vec.end()){}
else{}
如果vector中儲存自定義型別struct或class,需要自定義查詢函式:
class DemoStruct
{
string gpcode;
bool operator == (const DemoStruct & obj) const //過載 “==” 操作符,函式最後的 const 別忘了,否則會報錯。
{
return gpcode == obj.gpcode;
}
};
vector<DemoStruct>::iterator iter;
iter = find(vec_struct.begin(), vec_struct.end(), tmpdemo);
七.遍歷
for(vector<datatype>::iterator it=a.begin(); it!=a.end(); it++)
cout<<*it;
for(int i=0; i<a.size; i++)
cout<<a[i];
八、其他
取vector的陣列型別指標:
//vector第一個元素的地址,注意如果vector長度為0,那麼不會得到,需要判斷非空
if(!v.empty()) {
int *p = &v[0];
}
//利用vector的begin()迭代指標取值後再取地址
it = &*nums1.begin();
memcpy(merge,it,sizeof(int)*m);