1

私は構造のベクトルを持っています {key; 値}、キーでソート:

{ {0, 1}, {0, 2}, {1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 2} }

同じキーを持つ最後の要素を除くすべてを消去する必要があります。結果は次のようになります。

{ {0, 2}, {1, 3}, {2, 2} }

これを行うための最もきちんとした方法は何ですか? どの STL アルゴリズムを使用できますか? どうやら、このタスクは remove-erase イディオムに適合しません。

4

3 に答える 3

8

単純ですが効率的な解決策は、ベクターを反復処理して、関連する要素を新しいベクターにコピーすることです。

std::unique別の方法として、(適切な述語を使用して) を使用します。各グループの最後の要素を保持したいので、逆反復子を使用する必要があります。

于 2013-06-28T06:15:14.657 に答える
3

つまり、必要なアルゴリズムは次のようになります。

  • コンテナを逆方向に繰り返す
  • 新しい鍵に遭遇した場合は、要素を離れ、
  • 既に持っているキーに遭遇した場合は、その要素を削除してください。

コードで:

#include <vector>
#include <iostream>
#include <algorithm>

struct S { int key; int value; };

int main() {
  std::vector<S> vec{ {0, 1}, {0, 2}, {1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 2} };

  auto lastKey = std::numeric_limits<int>::max();
  auto rLast = std::remove_if(vec.rbegin(), vec.rend(), [&lastKey](S const& s) -> bool {
    if (s.key == lastKey) return true;
    lastKey = s.key;
    return false;
  });
  vec.erase(begin(vec),rLast.base());

  for (auto& s : vec) {
    std::cout << '{' << s.key << ',' << s.value << '}';
  }
}

またはstd::unique、他の回答で推奨されているように使用します。

auto rLast = std::unique(vec.rbegin(), vec.rend() [](S const& s1, S const& s2) {
  return s1.key == s2.key;
});
vec.erase(vec.begin(), rLast.base());
于 2013-06-28T07:30:11.237 に答える