0

私はこのループを持っています

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);
    }
}

オブジェクトをコンテナクラスに挿入し、==をオーバーロードして、オブジェクト内の2つのパラメータをチェックしました。それらが一致する場合は更新し、一致しない場合はベクトルに配置しますが、 vec1.size()を実行すると、3つのオブジェクトを挿入しても、0が返されます。ベクトルを適切に設定できないようです。

4

2 に答える 2

1

問題は、検索ループifにいることです。ループ本体が実行されないため、実行されることはありません。これは、0より大きくなることはないためです。if.size()

これを試して:

// 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;
}
于 2012-12-04T21:44:20.863 に答える
0

vec1が空から開始する場合、forループは実行されません。したがって、最初にvec1に少なくとも1つの要素が必要です。これを追加してみませんか:

vec1.push_back(*p);
for(int i=0;i<vec1.size();++i){//the rest}
于 2012-12-04T21:55:56.343 に答える