循环容器类c ++

时间:2012-12-04 21:37:38

标签: c++ loops vector

我有这个循环

for(int i=0;i<vec1.size();++i)
{
    if(vec1[i]==*p)
    {
        vec1[i]=*p;
        cout<<"element updated"<<endl;
    }
    else
    {
        cout<<"push_back"<<endl;
        vec1.push_back(*p);
    }
}

我在容器类中插入对象并且我重载了==来检查对象内部的两个参数,如果它们匹配,我想更新它们,如果它们不匹配,我想把它们放在矢量,但我似乎无法正确填充我的向量,当我做vec1.size()我得到0即使我插入3个对象。

2 个答案:

答案 0 :(得分:1)

您的问题是您的if 您的搜索循环。您的if永远不会被执行,因为您的循环体永远不会运行,因为您的.size()永远不会大于0。

试试这个:

// UNTESTED
std::vector<person> vec1;
add(person *p) {
  std::vector<person>::iterator it = std::find(vec1.begin(), vec1.end(), *p);
  if(it == vec1.end())
    vec1.push_back(*p);
  else
    *it = *p;
}

或者,如果你真的想手动编写循环代码:

// UNTESTED
std::vector<person> vec1;
add(person *p) {
  int i;
  for(i=0;i<vec1.size();++i) {
    if(vec1[i] == *p)
      break;
  }
  if(i == vec1.size())
    vec1.push_back(*p);
  else
    vec1[i] = *p;
}

当然,您可以考虑更换容器。使用std::map会缩短代码并减少操作大型数据集所需的时间。

std::map<std::string, person> map1;
add(person *p) {
  map1[p->name] = *p;
}

答案 1 :(得分:0)

当vec1从空开始时,for循环不会运行。所以你想要在vec1中至少有一个元素开头。怎么样添加这个:

vec1.push_back(*p);
for(int i=0;i<vec1.size();++i){//the rest}