【问题标题】:Vector of unique pointers: Finding and then rotating an element to the front of a vector by pointer唯一指针向量:通过指针查找元素并将其旋转到向量的前面
【发布时间】:2021-07-17 16:37:45
【问题描述】:

假设我有一个 std::vector 指向一个对象的唯一指针。

#include <memory>

struct MyObject {

};

std::vector<std::unique_ptr<MyObject> myObjects;

现在假设向量填充了一些对象,我想将特定指针旋转到前面。我尝试使用像这样的find_if 函数来找到一个支点:

#include <algorithm>

void rotate_to_front(MyObject * myobject){
     auto pivot = std::find_if(std::begin(myObjects), std::end(myObjects), [myObject](const MyObject & memberObject){
          return myObject == memberObject;
     });
}

但是clang 抛出deduced conflicting types for parameter 'Element'

找到我的支点后,我想使用std::rotate 将其移到前面。

std::rotate(std::begin(myObjects), pivot, pivot + 1);

注意事项:

  1. 有没有办法用std::find 而不是std::find_if 做到这一点?我也无法让它工作。

【问题讨论】:

  • 向量元素是 unique_ptr,而不是 MyObject。 lambda 的参数应该是 const unique_ptr& 或 const auto&。
  • @S.M.所以正确的做法是使用window == m_Window.get()?
  • 谢谢@S.M. !

标签: c++ algorithm find c++20 unique-ptr


【解决方案1】:

要编译std::find_if(),lambda的参数必须匹配std::vector中的对象类型,即std::unique_ptr&lt;MyObject&gt;而不是MyObject,或者可以隐式转换为参数类型,这是不可能的这个案例。所以,正确的方法是:

 auto pivot = std::find_if(std::begin(myObjects), std::end(myObjects), 
      [myObject](const std::unique_ptr<MyObject> & memberObject){
           return myObject == memberObject.get();
      });

有没有办法用 std::find 而不是 std::find_if 做到这一点?

为此,std::unique_ptr 必须提供一个 operator== 来比较原始指针,但事实并非如此,所以不,您必须自己提供一个谓词。

【讨论】:

  • 感谢您为我澄清这一点!也为@S.M. +1。的评论。
  • 不必匹配,只要兼容即可。但在这里,匹配是正确的。
猜你喜欢
  • 1970-01-01
  • 2011-03-12
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2014-04-02
  • 1970-01-01
  • 2014-09-12
相关资源
最近更新 更多