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

时间:2018-01-27 12:05:54

标签: c++ string vector set

从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。

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

2 个答案:

答案 0 :(得分:1)

一种简单的方法是迭代向量,同时跟踪遇到的元素,并删除之前遇到过的元素。

这是一段完全符合这一要求的代码。

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;
    }
}

Live on Coliru.

它可能是优化的,例如,当所有元素都是重复时删除元素的范围,或者可以通过用当前的第一个副本交换每个新元素,最后删除包含所有元素的向量的整个末尾。重复。

答案 1 :(得分:-1)

你可以创建set然后遍历vector,将set中的元素复制到vector中,然后从已经复制的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());