Search code examples
c++findsmart-pointersweak-references

Find weak_ptr in vector


I am trying to find weak_ptr in vector. I am using lambda expression as a third parameter to find but I can't understand why this code is not compiled:

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;

Maybe someone could point me what I am doing wrong. Thanks in advance.


Solution

  • I'm sure you meant std::find_if (which takes a predicate), not std::find (which takes a value).

    Also fixing your conditional at the end, and adding appropriate boilerplate, we get:

    #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)