使用 std::find 在 std::pair 的向量中查找元素
using std::find to find elements in vector of std::pair
有没有办法在 std::pair
的 std::vector
中使用 std::find
?
我想查看对的第一个成员并仅在对的第一个成员中搜索给定值。
当然,我可以用 for 循环明确地做到这一点,但我可以用更优雅的方式做到这一点吗?
(如果重要的话,我正在使用 c++14)
这是一个使用 std::find_if
的示例
include <iostream>
#include <vector>
#include <utility>
int main()
{
std::vector<std::pair<char, char>> v {
std::make_pair('a', 'A'),
std::make_pair('b', 'B'),
std::make_pair('c', 'C')
};
auto it = std::find_if(
v.begin(),
v.end(),
[](const auto& item) {
return std::get<0>(item) == 'b';
}
);
if (it != v.end()) {
// found!
std::cout << std::get<1>(*it) << std::endl;
}
else {
std::cout << "Not found" << std::endl;
}
}
我知道您使用的是 c++14,但总有一天(希望很快),您将能够使用 c++20,它具有 range-ified 允许您使用投影的算法。
所以如果你有一个向量对:
std::vector<std::pair<int, int>> v { {1,2}, {2,3}, {3,4} };
您可以 find
pair
其 first
成员等于这样的值:
auto f = std::ranges::find(v, 2, &std::pair<int, int>::first);
或者您可以 find_if
pair
的 first
成员满足某些谓词,如下所示:
auto is_even = [](auto i) { return i % 2 == 0; };
auto f = std::ranges::find_if(v, is_even, &std::pair<int, int>::first);
这几乎是它可能达到的最优雅的状态,因为代码现在实际上没有任何可降低的复杂性。
这里是 demo。
有没有办法在 std::pair
的 std::vector
中使用 std::find
?
我想查看对的第一个成员并仅在对的第一个成员中搜索给定值。
当然,我可以用 for 循环明确地做到这一点,但我可以用更优雅的方式做到这一点吗?
(如果重要的话,我正在使用 c++14)
这是一个使用 std::find_if
include <iostream>
#include <vector>
#include <utility>
int main()
{
std::vector<std::pair<char, char>> v {
std::make_pair('a', 'A'),
std::make_pair('b', 'B'),
std::make_pair('c', 'C')
};
auto it = std::find_if(
v.begin(),
v.end(),
[](const auto& item) {
return std::get<0>(item) == 'b';
}
);
if (it != v.end()) {
// found!
std::cout << std::get<1>(*it) << std::endl;
}
else {
std::cout << "Not found" << std::endl;
}
}
我知道您使用的是 c++14,但总有一天(希望很快),您将能够使用 c++20,它具有 range-ified 允许您使用投影的算法。
所以如果你有一个向量对:
std::vector<std::pair<int, int>> v { {1,2}, {2,3}, {3,4} };
您可以 find
pair
其 first
成员等于这样的值:
auto f = std::ranges::find(v, 2, &std::pair<int, int>::first);
或者您可以 find_if
pair
的 first
成员满足某些谓词,如下所示:
auto is_even = [](auto i) { return i % 2 == 0; };
auto f = std::ranges::find_if(v, is_even, &std::pair<int, int>::first);
这几乎是它可能达到的最优雅的状态,因为代码现在实际上没有任何可降低的复杂性。
这里是 demo。