1 基本用法
ranges::find
是C++20中引入的<algorithm>
头文件中的新功能,属于ranges
库的一部分。它提供了对容器进行查找的简洁语法和增强的功能。ranges::find
用于在范围内查找特定元素,返回一个指向该元素的迭代器。
以下是ranges::find
的基本用法:
#include <iostream>
#include <algorithm>
#include <ranges>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
auto it = ranges::find(vec, 3);
if (it != vec.end()) {
cout << "Found: " << *it << endl;
} else {
cout << "Not found" << endl;
}
return 0;
}
在这个示例中,ranges::find
在向量vec
中查找元素3
。如果找到了,返回一个指向该元素的迭代器,否则返回vec.end()
。
2 与std::find的比较
ranges::find
的使用方式类似于传统的std::find
,但它提供了一些额外的优势,比如对范围和投影的支持。以下是两者的比较:
#include <iostream>
#include <algorithm>
#include <ranges>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
//使用std::find
auto it1 = find(vec.begin(), vec.end(), 3);
if (it1 != vec.end()) {
cout << "std::find Found: " << *it1 << endl;
} else {
cout << "std::find Not found" << endl;
}
//使用ranges::find
auto it2 = ranges::find(vec, 3);
if (it2 != vec.end()) {
cout << "ranges::find Found: " << *it2 << endl;
} else {
cout << "ranges::find Not found" << endl;
}
return 0;
}
在这个示例中,find
和ranges::find
都可以用于查找元素,但ranges::find
使用起来更简洁,因为不需要明确传递迭代器范围。
ranges::find
支持投影功能,可以方便地对复杂结构进行查找。
#include <iostream>
#include <algorithm>
#include <ranges>
#include <vector>
using namespace std;
struct Person {
int id;
std::string name;
};
int main() {
vector<Person> people = {
{1, "Alice"},
{2, "Bob"},
{3, "Charlie"}
};
auto it = ranges::find(people, 2, &Person::id);
if (it != people.end()) {
std::cout << "Found: " << it->name << endl;
} else {
std::cout << "Not found" << endl;
}
return 0;
}
在这个示例中,我们在people
向量中查找id
为2
的元素,并通过&Person::id
指定了投影。ranges::find
将返回一个指向id
为2
的Person
对象的迭代器。