我有一个std::vector<std::string> textLines,其中包含大量的城市名称。我使用以下方法删除重复项:

using namespace std;

vector<string>::iterator iter;

sort(textLines.begin(), textLines.end());
iter = unique(textLines.begin(), textLines.end());

此时,重复元素在 vector 的结尾都是空(空)字符串,其大小与unique()之前的大小相同。

我用以下方法删除它们:
textLines.resize(distance(textLines.begin(), iter));

可以,但是有办法保留删除的重复项吗?如果重复项只是移到末尾而不用空字符串代替,对我来说会更好。

新端由iter指出,是从unique()返回的,因此找到 vector 的新端没有问题。

换句话说,我想知道哪些行具有重复项,哪些行没有重复项。

最佳答案

您可以非常简单地完成此操作,而无需实际大幅度更改逻辑。
您可以将重复项存储在另一个容器中,该容器由传递给unique()的比较谓词捕获:

vector<string> duplicates;
auto iter = unique(textLines.begin(), textLines.end(), [&duplicates](auto& first, auto& second) -> bool {
    if (first == second)
    {
        duplicates.push_back(second);
        return true;
    }

    return false;
});

实时示例:here

08-27 17:37