C++ vector使用总结

一、拷贝主要几种方法:

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不需要容量,是由于它的每次增长,只是简单的链接新元素而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧特克_Glodon

很高兴能帮助到您!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值