std::pairの入ったvectorのソートと重複削除

[戻る]
kyu 2003/12/05(金) 14:37:47
std::vector< std::pair< std::string, std::string > で
std::pairのfirstのみを対象にソートと重複削除をしたいです。

当初、std::mapに入れて、それをまたvectorにコピーしようと思ったのですが
効率的ではないような気がしました。そこで、

ソートはstd::sortを利用しようと思ったのですが、第3引数に渡す
比較関数をどう書けばいいのかわかりませんでした。
std::sort(v.begin(), v.end(), ??? );

また、重複削除には、std::uniqueを利用しようと思ったのですが、
第3引数に渡す二項述語関数?をどう書けばいいのかわかりませんでした。
v.erase(std::unique(v.begin(), v.end(), ???), v.end());

(std::uniqueへ渡すものは、ソートされている必要があると認識してるのですが、正しい
のでしょうか?)

STL得意な方、教えてください。

επιστημη [E-Mail] [HomePage] 2003/12/05(金) 15:31:21
#include <iostream>
#include <utility>   // pair
#include <algorithm> // sort
#include <vector>    // vector

typedef std::pair<std::string,std::string> str_pair;

struct str_pair_less {
  bool operator()(const str_pair& x, const str_pair& y) const {
    return x.first < y.first;
  }
};

struct str_pair_equal {
  bool operator()(const str_pair& x, const str_pair& y) const {
    return x.first == y.first;
  }
};

int main() {
  std::vector<str_pair> v;
  v.push_back(str_pair("zero", "0"));
  v.push_back(str_pair("one",  "1"));
  v.push_back(str_pair("two",  "2"));
  v.push_back(str_pair("three","3"));
  v.push_back(str_pair("four", "4"));
  v.push_back(str_pair("zero", "れい"));
  v.push_back(str_pair("one",  "いち"));
  v.push_back(str_pair("two",  "にぃ"));
  v.push_back(str_pair("three","さん"));
  v.push_back(str_pair("four", "しぃ"));

  std::sort(v.begin(), v.end(), str_pair_less());
  std::cout << "\nsorted\n";
  for ( size_t i = 0; i < v.size(); ++i ) {
    std::cout << v[i].first << ':' << v[i].second << std::endl;
  }

  v.erase(std::unique(v.begin(), v.end(), str_pair_equal()), v.end());
  std::cout << "\nduplicated data eliminated\n";
  for ( size_t i = 0; i < v.size(); ++i ) {
    std::cout << v[i].first << ':' << v[i].second << std::endl;
  }

  return 0;
}

> (std::uniqueへ渡すものは、ソートされている必要があると認識してるのですが、
>  正しいのでしょうか?)

YES (uniqueは'隣接する'等しい要素を削除するから)

kyu 2003/12/05(金) 15:47:54
[[解決]]
うまくいきました。
どうもありがとうございました!->επιστημηさん

古いスレッドには追加発言できません。