一、拷贝主要几种方法:
vector<int> list;
list.push_back(1);
list.push_back(2);
1)初始化构造时拷贝
vector<int> tem(list);
这种拷贝,相当于复制了一份数据,list中的数据不变。
2)assign
vector<int> temlist;
temlist.assign(list.begin(), list.end());
一样的复制了一份数据,list中的数据不变。
3)swap
vector<int> temlist;
temlist.swap(list);
将list中数据全部移到temlist中,此时list中为空了
4)insert
vector<int> temlist;
vector<int> temlist2;
temlist2.push_back(2);
temlist2.push_back(2);
temlist.insert(temlist.end(), temlist2.begin(), temlist2.end());
将temlist2中的数据,全部插入到temlist的末尾。相当于复制了一份数据
二、获取iteror遍历指针当前所在的位置:
int nFndPos = (int)std::distance(vecDatas.begin(), iterData);
三、find_if用法:
std::vector<NODE_DATA_3D>::iterator iterNodeData = std::find_if(pipe3DData.vecNodeDatas.begin(), pipe3DData.vecNodeDatas.end(),
[strSCodeNum](NODE_DATA_3D pNodeData) { return pNodeData.strCodeNum == strSCodeNum; });
DataBatchArray::const_iterator shadowBatch = std::find_if(m_vecDataBatch.begin(), m_vecDataBatch.end(),[&](const DataBatch& pItem) { return pItem.nId == (*intIter)+10000; });
map<int, char*> mapItems;
auto it = find_if(mapItems.begin(), mapItems.end(), [&](const pair<int, char*> &item) {
return item->first == 0/*期望值*/;
vector<testStruct> testStructVector;
auto itrFind = find_if(testStructVector.begin(), testStructVector.end(), [](testStruct myStruct){return myStruct.a > 2 && myStruct.b < 8;});
四、获取指针的地址存入另一个vecror中:
CModel::DataArributeArray::iterator iterSpecialAtt = curAttrs.begin();
for (; iterSpecialAtt != curAttrs.end(); ++iterSpecialAtt)
{
modelDatas.m_specialProps.push_back(&(*iterSpecialAtt));
}
五.、vector删除元素
针对于非array容器有多种删除方式,以erase为例,比如:
c.erase§; // 删除迭代器p所指定的元素,返回一个指向被删除元素之后的迭代器。
c.erase(begin,end); // 删除b,e所指定范围内的元素,返回一个指向被删除元素之后的迭代器。
c.clear(); // 删除所有元素
注意,删除元素,会导致迭代器无效。故下面的编写方式是错误的,比如:
std::vector<int> nVec;
for(int i = 0; i < 5; ++i)
nVec.push_back(i);
std::vector<int>::iterator iter = nVec.begin();
for(; iter != nVec.end(); ++iter)
{
if(*iter == 1)
nVec.erase(iter);
}
正确的方式是(删除特定元素):
std::vector<int>::iterator iter = nVec.begin();
for(; iter != nVec.end();)
{
if(*iter == 0)
iter = nVec.erase(iter);
else
iter++;
}
删除容器内某一个特定的元素,编写方式可为:
std::vector<int>::iterator iter = std::find(nVec.begin(),nVec.end(),5);
if(iter != nVec.end())
nVec.erase(iter);
删除容器内某一段范围内的元素,编写方式可为:
first = std::find(nVec.begin(),nVec.end(), value1);
last = std::find(nVec.begin(),nVec.end(), value2);
if(first != nVec.end() && last != nVec.end()) // 判断有效性
{
nVec.erase(first,last);
}
删除容器内所有元素,当然可以这样:
nVec.erase(nVec.begin(),nVec.end());
也可以 nVec.clear();
vector<int>().swap( temlist);
std::vector<int> ModuleArr;
//排序
std::sort(ModuleArr.begin(), ModuleArr.end());
//去重
ModuleArr.erase(unique(ModuleArr.begin(), ModuleArr.end()), ModuleArr.end());
六、 vector的容量与大小
vector并非随着每个元素的插入而增长自己,它总是分配一些额外的内存容量,这种策略使得vector的效率更高些。若要获取当前vector的大小,可调用size()函数,而获取当前vector的容量,可调用capcity()。
注意,list不需要容量,是由于它的每次增长,只是简单的链接新元素而已。