たいちうさんみたいに set を使えば、結構簡単にソートせずに重複を確認していくというのができそうですね。
std::vector<std::string> v;
// v に値を設定する
std::set<std::string> set;
std::vector<std::string> result;
for (std::vector<std::string>::iterator it = v.begin(); it != v.end(); ++it)
{
if (set.insert(*it).second)
result.push_back(*it);
}
// result にソートされていない unique な値が入っている
で、あとはこの処理を汎用的に使えるようにしておくといいかもしれませんね。
// *a < *b で比較するための predicate
struct direct_less
{
template<class Iterator>
bool operator()(const Iterator& a, const Iterator& b) const
{
return *a < *b;
}
};
template<class Iterator, class OutputIterator>
void unique_no_sort(Iterator first, Iterator last, OutputIterator out)
{
// 要素をコピーするのはコストがでかいので Iterator を格納するようにする
std::set<Iterator, direct_less> set;
for (; first != last; ++first)
{
if (set.insert(first).second)
*out++ = *first;
}
}
こんなのを作っておけば、
std::vector<std::string> v;
// v に値を設定する
std::vector<std::string> result;
unique_no_sort(v.begin(), v.end(), std::back_inserter(result));
// result に unique な値が入っている
とかできるようになります。