在向量中找到weak_ptr

问题描述 投票:0回答:1

我试图在向量中找到weak_ptr。我使用lambda表达式作为第三个参数来查找,但我不明白为什么这个代码没有编译:

std::vector<std::weak_ptr<Car>> cars;

std::shared_ptr<Car> lambo = std::make_shared<Car>();
std::weak_ptr<Car> wPtr(lambo);
cars.emplace_back(lambo);

const auto pos = std::find(cars.begin(), cars.end(), [&wPtr](const std::weak_ptr<Car>& ptr1) {
    return ptr1.lock() == wPtr.lock();
});

if (pos != cars.end())
    cout << "Not found!" << endl;

也许有人可以指出我做错了什么。提前致谢。

c++ find smart-pointers weak-references
1个回答
2
投票

我敢肯定你的意思是std::find_if(它采用谓词),而不是std::find(取值)。

同时修复条件,并添加适当的样板,我们得到:

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

struct Car {};

int main()
{
    std::vector<std::weak_ptr<Car>> cars;

    std::shared_ptr<Car> lambo = std::make_shared<Car>();
    std::weak_ptr<Car> wPtr(lambo);
    cars.emplace_back(lambo);

    const auto pos = std::find_if(cars.begin(), cars.end(), [&wPtr](const std::weak_ptr<Car>& ptr1) {
        return ptr1.lock() == wPtr.lock();
    });

    if (pos == cars.end())
        std::cout << "Not found!" << std::endl;
    else
        std::cout << "Found!" << std::endl;
}

// Output: Found!

(live demo)

© www.soinside.com 2019 - 2024. All rights reserved.