C++中的ranges::find用法

6 阅读2分钟

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;
}

在这个示例中,findranges::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向量中查找id2的元素,并通过&Person::id指定了投影。ranges::find将返回一个指向id2Person对象的迭代器。