当我在此代码中调用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/