cpp-vector

如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector

原理

pointer _Myfirst;   // pointer to beginning of array
pointer _Mylast; // pointer to current end of sequence
pointer _Myend; // pointer to end of array
20190515_144147.png

大小:size=_Mylast - _Myfirst;
容量:capacity=_Myend - _Myfirst;
分别对应于resize()、reserve()两个函数。
size表示vector中已有元素的个数,容量表示vector最多可存储的元素的个数;为了降低二次分配时的成本,vector实际配置的大小可能比客户需求的更大一些,以备将来扩充,这就是容量的概念。即capacity>=size,当等于时,容器此时已满,若再要加入新的元素时,就要重新进行内存分配,整个vector的数据都要移动到新内存。二次分配成本较高,在实际操作时,应尽量预留一定空间,避免二次分配。

初始化

// 通过数组地址初始化
int a[5] = {1,2,3,4,5};
//通过数组a的地址初始化,注意地址是从0到5(左闭右开区间)
vector<int> b(a, a+5);

// 通过另一个 vector 初始化
v2.assign(v1.begin(),v1.end());

//c++ 11
vector<string> g_vResultKeyName = { "gisType", "source","nationality" };

二维数组初始化

std::vector<std::vector<int32_t>> vChess;

typeChess()
{
vChess.assign(vChess.size(), std::vector<int32_t>(vChess.size(), '.'));
}

查找

合并

AB.reserve( A.size() + B.size() ); // preallocate memory
AB.insert( AB.end(), A.begin(), A.end() );
AB.insert( AB.end(), B.begin(), B.end() );

插入

vector_name.insert (position, val)
vector_name.insert(position, size, val)
vector_name.insert(position, iterator1 , iterator2)

// program below illustrates the
// vector::insert() function

#include <bits/stdc++.h>
using namespace std;

int main()
{
// initialising the vector
vector<int> vec = { 10, 20, 30, 40 };

// inserts 3 at front
auto it = vec.insert(vec.begin(), 3);

// inserts 2 at front
vec.insert(it, 2);

cout << "The vector elements are: ";
for (auto it = vec.begin(); it != vec.end(); ++it)
cout << *it << " ";

return 0;
}

The vector elements are: 2 3 10 20 30 40

v[i]与v.at(i)的区别

void f(vector<int> &v)
{
v[0]; // A
v.at[0]; // B
}

如果 v 非空,A 行和 B 行没有任何区别。如果 v 为空,B行会抛出 std::out_of_range 异常,A 行的行为未定义。

c++ 标准不要求 vector::operator[] 进行下标越界检查,原因是为了效率,总是强制下标越界检查会增加程序的性能开销。
设计vector是用来代替内置数组的,所以效率问题也应该考虑。不过使用 operator[] 就要自己承担越界风险了。

如果需要下标越界检查,请使用 at。

emplace_back vs push_back

emplace_back not copy and move object to container
A similar member function exists, push_back, which either copies or moves an existing object into the container

string to vector

std::vector<BYTE> m_vCmdBuf
string cmd = getDevParam(m_counter++, param);
m_vCmdBuf.assign(cmd.begin(), cmd.end());

获取最后一个元素

声明:vector vec;
方法一: return vec.at(vec.size()-1);
方法二: return vec.back();
方法三: return vec.end()-1; 注意:end指向末尾元素的下一个元素。
方法四: return vec.rbegin();

复制

vector<int> temlist;
temlist.assign(list.begin(), list.end());