当我在此代码中调用unique()时,输出最终将在末尾附加最终元素的副本。

vector<vector<int>> ints;
for(int i(0); i<files; i++)
{
    stringstream stream(list[i]);
    int num(0);
    vector<int> aList;
    for(int j(0); j<list[i].length(); j++)
    {
        if(stream.peek() == ' ')
                stream.ignore();
        while (stream >> num)
        {
            aList.push_back(num);
            if(stream.peek() == ' ')
                stream.ignore();
        }
    }
    ints.push_back(aList);
    unique(ints[i].begin(), ints[i].end());
}


我有一个称为list的字符串向量(实际上是整数列表),该向量被解析为int并存储在多维向量中。 unique()用于从创建的整数向量中删除重复项。

无论如何,我的问题是这样的:如何获得unique()以停止添加额外的元素?

最佳答案

如果查看std::unique的文档,则会注意到:


  从范围[first,last)中删除所有连续的重复元素,并为该范围的新逻辑末尾返回一个post-the-end迭代器。


强调原始。返回值仅应在结尾处出现-该算法实际上不会从容器中删除任何元素,因为在一般情况下它不知道如何执行此操作。

这就是为什么您需要采用unique的结果并将其传递给erase的原因。从文档中的示例中:

auto last = std::unique(v.begin(), v.end());
v.erase(last, v.end());


或针对您的特定情况:

ints[i].erase(
    // new logical end
    std::unique(ints[i].begin(), ints[i].end()),
    // actual end
    ints[i].end());


另请注意,unique仅删除连续的重复项-并非所有重复项。如果您确实想要真正独特的结果,则需要首先sort您的向量。

关于c++ - unique()似乎正在添加最后一个元素的另一个拷贝,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28335997/

10-11 22:30
查看更多