3

私はC++が初めてです。ベクター内の重複する文字列を見つけて、文字列の 1 つのコピーを出力する方法を知りたいと思っていました。たとえば、<"cat", "dog", "dog", "bird",> がある場合、cat、dog、bird が出力されます。ベクトルをソートし、adidas_find 関数を使用してベクトルを反復処理しています (単語が重複しているかどうかを確認する必要があるため)。私のコードは重複を検出しますが、重複していないものだけを出力します。重複していないすべての文字列と重複する文字列の 1 つだけを出力するように変更したいので、ベクトル内のすべての文字列が出力されます。これが私がこれまでに持っているコードです:

public: void print(vector<string> in) // print method for printing a vector and it's key
{ 

  sort(in.begin(), in.end()); // sort the vector alphabetically first

  vector<string>::iterator it; 

      for( it = in.begin(); it != in.end(); it++ ) // iterate through it


             if(adjacent_find(in.begin(), in.end()) == in.end()) // don't print duplicates


             cout << *it<<endl; // and print out each string in the vector
}
4

3 に答える 3

5

STL アルゴリズムstd::unique()またはstd::unique_copy(). ベクターだけでなく、あらゆる STL コンテナーで動作します。

ベクトルを標準出力に出力する簡単な例:

#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

int main()
{
    vector<string> v = { "hello", "hello", "world" };
    unique_copy(begin(v), end(v), ostream_iterator<string>(cout, " "));
}

代わりにこの操作をインプレースで実行する場合は、 を使用できますstd::unique()。この関数は冗長な要素を物理的に削除するのではなく、イテレータをコレクションの新しい論理的な末尾に戻すことに注意してください。

#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

int main()
{
    vector<string> v = { "hello", "hello", "world" };
    auto newEnd = unique(begin(v), end(v));
    for_each(begin(v), newEnd, [] (string const& s) { cout << s << " "; });
}
于 2013-01-27T21:43:37.853 に答える
3

を試してくださいstd::unique。これは、同一要素の連続するすべてのグループから最初の要素を除くすべてを削除します (その他の例 + 情報はこちら)。あなたのベクトルはソートされているので、これはあなたが望むもののように聞こえます.

于 2013-01-27T21:43:21.697 に答える
1

ベクターがすでにソートされている場合は、std::unique連続する重複を削除するために使用できます。

もう 1 つの方法はstd::set、ベクターから を構築することです。設計上、独自の要素が含まれます。

于 2013-01-27T21:43:43.697 に答える