从字符串的有序向量中删除重复项

Remove duplicates from ordered vector of strings

本文关键字:删除 向量 字符串      更新时间:2023-10-16

从C++ std::vector<std::string>中删除重复项的最简单方法是什么?我希望保留订单。

例如:

std::vector<std::string> container;
container.push_back("z");
container.push_back("y");
container.push_back("x");
container.push_back("z");

最后,我只想让我的向量包含(按顺序(:z,y,x。

为了删除重复项,我可以简单地将每个向量项添加到集合/unordered_set中,但它会根据默认比较对象的标准修改顺序。

一种简单的方法是遍历向量,同时跟踪遇到的元素,并删除以前遇到的元素。

这是一段代码,正是这样做的。

std::unordered_set<std::string> encounters;
for (auto i = 0u; i < container.size(); ++i) {
    if (!encounters.insert(container[i]).second) {
        // The string was already in encounters
        container.erase(container.begin() + i);
        --i;
    }
}

住在科利鲁。

它可能会被优化,例如,当所有元素都是重复的时,通过删除元素范围,或者通过将每个新元素与当前的第一个副本交换,并在最后擦除包含所有重复项的向量的整个末端。

您可以创建 set,然后迭代 vector,将 set 中的元素复制到向量中,然后从 set 中删除已复制的每个元素。 例如:

std::vector<int> v{1,1,2,2,3,3};
std::set<int> s(v.begin(), v.end());
vector<int> v2(s.size());                  // v2 will contain unique elements 
                                           // from v in the same order
for (int i = 0, j=0; i < v.size(); ++i) {
    if (s.find(v[i]) != s.end()) {
       v2[j++] = v[i];
       s.erase(v[i]);
    }
}
v.assign(v2.begin(), v2.end());