到目前为止,我有这个功能:
std::vector<int> f(std::vector& v)
{
std::vector<int> result;
for(unsigned x = 0; x < v.size(); x++)
{
std::vector<int>::iterator location = std::find(result.begin(),result.end(),v[x]);
if(location == result.end())
{
result.push_back(this->v[x]);
}
}
std::sort(result.begin(),result.end());
return result;
}
此函数返回v中元素的有序向量,没有重复。
有更紧凑的写作方式吗?我读过有关std :: unique的内容,但这涉及到编辑我无法做到的向量。
答案 0 :(得分:6)
由于您无论如何都在复制矢量,只需复制,然后对结果进行排序和唯一:
std::vector<int> f(std::vector<int> v) {
using std::begin;
using std::end;
std::sort(begin(v), end(v));
v.erase(std::unique(begin(v), end(v)), end(v));
return v;
}
答案 1 :(得分:3)
我读过std :: unique,但这涉及编辑我无法做到的向量。
先复制一份!然后您可以按常规方式使用unique/erase
。在C ++ 03中你会写:
std::vector<int> f(const std::vector<int>& v)
// ^^^^^ you won't modify v, so make it obvious!
{
std::vector<int> result(v); // copy the vector
std::sort(result.begin(),result.end()); // sort it first so that std::unique can work
std::erase(std::unique(result.begin(),result.end()), result.end()); // just keep the unique elements
return result;
}
如果您使用C ++ 11,那么您可以利用移动语义和值传递参数(当您将rvalue传递给函数时效率更高,并且对于左值也同样有效)你可以直接修改参数:
std::vector<int> f(std::vector<int> v)
// ^^^^^^^^^^^^^^^^ pass by value
{
std::sort(v.begin(),v.end()); // sort it first so that std::unique can work
std::erase(std::unique(v.begin(),v.end()), v.end()); // just keep the unique elements
return v;
}
感谢@DavidBrown和@chris,我倾向于忽视这个C ++ 11的习惯用法,因为我还没有习惯它。