簡體   English   中英

如何將 std::find_if 與唯一指針向量一起使用?

[英]How to use std::find_if with a vector of unique pointers?

您如何將std::find_if類的算法與唯一指針向量一起使用? 例如:

#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>

class Integer {
public:
    explicit Integer(int i): i_(i){};

    int get() const{
        return i_;
    }

private:
    int i_;
};

using IntegerPtr = std::unique_ptr<Integer>;

int main() {
    IntegerPtr p1 = std::make_unique<Integer>(4);
    IntegerPtr p2 = std::make_unique<Integer>(5);
    IntegerPtr p3 = std::make_unique<Integer>(6);
    std::vector<IntegerPtr> vectorOfIntegerPointers({
        std::move(p1),
        std::move(p2),
        std::move(p3),
    });

    int i = 5;

    auto first_index_larger_than_i = std::find_if(vectorOfIntegerPointers.begin(), vectorOfIntegerPointers.end(), [&](IntegerPtr s) {
        return s->get() > i;
    });

    std::cout << first_index_larger_than_i.get() << std::endl;

    return 0;
}

失敗

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:1881:31: error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<Integer, std::__1::default_delete<Integer> >'
            ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
                              ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

代碼中有兩個問題都導致試圖復制不可復制的unique_ptr

  1. unique_ptr不能傳遞給vector(initializer_list)構造函數,因為initializer_list將其元素包裝為const對象,並且const object 不能被移出。 所以移動構造函數不參與重載決議,只留下復制構造函數作為候選者,后來編譯失敗,出現您看到的錯誤:“調用隱式刪除的復制構造函數”。

    因此,您必須使用另一種解決方案來構造vector<unique_ptr> ,例如使用push_back

     std::vector<IntegerPtr> vectorOfIntegerPointers; vectorOfIntegerPointers.push_back(std::make_unique<Integer>(4)); vectorOfIntegerPointers.push_back(std::make_unique<Integer>(5)); vectorOfIntegerPointers.push_back(std::make_unique<Integer>(6));

    或者編寫一個包裝器來保存unique_ptr作為mutable成員(示例)。

  2. std::find_if中使用的[&](IntegerPtr s) {... }嘗試按值獲取unique_ptr的實例。 unique_ptr不可復制,因此出現相同的錯誤。

    一個快速的解決方法是通過引用來代替它們:

    [&](IntegerPtr const& s) {... }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM