在向量中查找 weak_ptr
Find weak_ptr in vector
我试图在矢量中找到 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;
也许有人可以指出我做错了什么。提前致谢。
我确定你的意思是 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)
我试图在矢量中找到 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;
也许有人可以指出我做错了什么。提前致谢。
我确定你的意思是 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!