3

我是 C++ 新手。我想知道如何在向量中找到重复的字符串并打印出字符串的一个副本。例如,如果我有 <"cat", "dog", "dog", "bird",> 它将打印出 cat, dog, bird。我已经对我的向量进行了排序,并且正在使用相邻查找函数并遍历向量(因为我必须查找是否有任何单词重复)。我的代码检测到重复项,但它只打印出非重复项。我想更改它以打印出所有非重复项以及其中一个重复项,以便打印出向量中的所有字符串。这是我到目前为止的代码:

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

Try std::unique,它从每组连续的相同元素中删除除第一个元素之外的所有元素(更多示例+信息here)。由于您的矢量已排序,这听起来像您想要的。

于 2013-01-27T21:43:21.697 回答
1

如果您的向量已经排序,您可以使用它std::unique来删除连续的重复项。

另一种选择是std::set从向量构造一个。这将具有设计独特的元素。

于 2013-01-27T21:43:43.697 回答