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得意な方、教えてください。
#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は'隣接する'等しい要素を削除するから)
うまくいきました。
どうもありがとうございました!->επιστημηさん