您好,非常感谢!
我正在std::unique
使用erase
到std::vector
。要检查唯一性,我调用结构的布尔函数。因为我想使用预定义的容差,所以我尝试添加一个传递所需值的构造函数。它有效,但我不知道为什么。
std::vector<std::pair<int,double> > myVec;
struct Check{
double tol_ = 0.0;
Check(double tol) : tol_(tol)
{
}
bool operator()(const std::pair<int,double> &a,
const std::pair<int,double> &b)
{
return fabs(a.second-b.second) < tol_;
}
};
// fill vector
...
// remove duplicates
myVec.erase(std::unique(myVec.begin(), myVec.end(), Check(0.1)), myVec.end());
这在某种程度上是合理的做法吗?我对unique
感到困惑。到达此函数时,使用容差构造结构Check
。
接下来unique
多次调用这个结构来比较矢量元素,将它们作为参考传递?
感谢您的努力!
答案 0 :(得分:2)
在调用Check(0.1)
时std::unique
执行的操作是创建临时对象时会发生什么。此临时对象的生命周期将为完整表达式的结尾。
临时对象像任何其他对象一样传递给std::unique
函数。这是有效的,因为该参数是一个模板化的参数,并且可以具有与其使用相匹配的任何类型。
简而言之,对std::unique
的调用大致相当于以下内容:
// Enter new nested local scope
{
Check temporary_object(0.1); // Create object
std::unique(..., temporary_object);
}
// Left nested scope, the `temporary_object` is destructed