2012-02-20 11 views
2

私は時間のベクトルを持ち、時間が重複する場所がいくつかあります。時間ベクトルは、テキストファイルからの1列のデータだけであり、同じデータテキストファイルからのいくつかの他のベクトル(速度、位置など)が存在する。他のすべてのエントリを維持しながら、重複したエントリを時間に基づいて削除するにはどうすればよいですか?私が実際にいくつかのベクトルを持っているので、それらの重複したエントリも削除します。私は他のベクトルのデータの順序を保持する必要があります(必ずしも連続しているわけではありません)。C++ベクトル内の重複エントリを削除する

重複している重複点を削除したいだけです。

ありがとうございました。

+0

あなたは_consectutive_重複、またはすべての重複を削除したいだけですか? –

+0

連続した重複。 – user1187621

答えて

1

これは、std :: sortを使用してベクトルをソートし、std :: uniqueを使用してベクトル全体の範囲(.begin()から.end ())。

、あなたはおそらく、より効率的な方法を見つけることができますが、これは、少なくとも興味深いものですし、重複があなたがerase-remove idiomに、この変化を使用することができますお互いに従って言うようにコードのみの2行:)

+0

私は実際にいくつかのベクトルを持っているので、それらの重複したエントリーも同様に削除します。他のベクトルのデータの順序を保持する必要があります(必ずしも連続しているわけではありません)。 – user1187621

1

が必要になりますそうでない場合は、あなたが最初にソートする必要があるだろう(std::sortまたはstd::stable_sortを参照)

time.erase(std::unique(time.begin(),time.end()),time.end()); 
+0

VC++ 2010でstd :: uniqueが表示されません – user1187621

+1

@ user1187621: ''ヘッダー。 Afaikそれはpre-C++ 11ライブラリですので、VS2010はそれを持っている必要があります(自分自身を検証することはできません)。 – KillianDS

+0

これは動作しますが、この方法を他のベクトルで使用する場合を除いて、私は時間ベクトルから行うよりも多くの "重複"データポイントを削除してしまいます。私は連続した重複ポイントを削除したいだけです。 – user1187621

1

理由だけではなく、そもそも重複を追加することは避けられませんか? I.アイテムをベクターに追加する前にそのアイテムがすでに存在するかどうかを確認してください。

+0

私はテキストファイルからデータを読み込んでいます。読み込んでいる方法は、値が同じかどうかを確認するために実際には設定されていません。 – user1187621

1

順序が保存されなければならないとの重複は連続していない場合は、次の

{ 
    auto i = time.begin() 
    std::set<time::value_type> exists; 
    while(i != time.end()) { 
     if (exists.insert(*i).second == false) //it's a duplicate: 
      i = time.erase(i); 
     else //else not a duplicate 
      ++i; 
    } 
} 
0

私はちょうど新しいベクトルにデータをコピーし、道に沿って重複したエントリを削除することになりました。

関連する問題