0

我正在使用 lower_bound() 在 weak_ptr 的排序向量中进行搜索

vector<weak_ptr<A> >::iterator findA( const string & id ) const
{
    sa = make_shared<A>( id );
    a = sa;
    return lower_bound( owners.begin(), owners.end(), sa,
            [] ( const weak_ptr<A> & l, const weak_ptr<A> & r ) 
                {
                    return (l.lock()->getID() < r.lock()->getID());
                } );
}

在哪里,类有一个私有sa方法和一个公共方法。调用时会导致段错误。我猜是因为,它返回 empty 。shared_ptr<A>Astring IDgetIDfindAgetIDlock()shared_ptr

我该如何解决?

4

1 回答 1

1

您不能对值不确定的元素进行排序(并且存储在weak_ptr 中的值也不是确定的)。因此,您无法知道向量是否已排序。

如果您确实知道它已排序(因为对象仅在您调用 lower_bound 的同一线程中不存在),那么您需要确保

  1. 向量的排序方式是所有空的weak_ptr都小于所有非空的。
  2. 所有空的weak_ptr不小于彼此。
  3. 相同的比较器用于向量的排序和 lower_bound 函数。

如果您不能保证在调用lower_bound 之前和之后元素的顺序保持不变(在上述比较器下),那么您不能使用lower_bound。

换句话说,您可以通过检查它并在比较器中适当地处理它来解决 lock 将返回一个空指针的事实,但如果您的对象在不同的​​线程中消失,您不应该这样做(因为您的订单不是确定性的)。

于 2015-04-06T01:53:31.417 回答