在 stdvector 中查詢元素

<algorithm> 頭中定義的函式 std::find 可用於查詢 std::vector 中的元素。

std::find 使用 operator== 來比較元素的相等性。它將迭代器返回到範圍內的第一個元素,該元素與值相等。

如果找不到相關元素,std::find 將返回 std::vector::end(如果向量為 const 則返回 std::vector::cend)。

Version < C++ 11

static const int arr[] = {5, 4, 3, 2, 1};
std::vector<int> v (arr, arr + sizeof(arr) / sizeof(arr[0]) );

std::vector<int>::iterator it = std::find(v.begin(), v.end(), 4);
std::vector<int>::difference_type index = std::distance(v.begin(), it);
// `it` points to the second element of the vector, `index` is 1

std::vector<int>::iterator missing = std::find(v.begin(), v.end(), 10);
std::vector<int>::difference_type index_missing = std::distance(v.begin(), missing);
// `missing` is v.end(), `index_missing` is 5 (ie. size of the vector)

Version >= C++ 11

std::vector<int> v { 5, 4, 3, 2, 1 };

auto it = std::find(v.begin(), v.end(), 4);
auto index = std::distance(v.begin(), it);
// `it` points to the second element of the vector, `index` is 1

auto missing = std::find(v.begin(), v.end(), 10);
auto index_missing = std::distance(v.begin(), missing);
// `missing` is v.end(), `index_missing` is 5 (ie. size of the vector)

如果你需要在大型向量中執行許多搜尋,那麼在使用 binary_search 演算法之前,你可能需要先考慮對向量進行排序。

為了找到滿足條件的向量中的第一個元素,可以使用 std::find_if。除了給 std::find 提供的兩個引數外,std::find_if 接受第三個引數,它是一個函式物件或指向謂詞函式的函式指標。謂詞應該接受容器中的元素作為引數,並返回一個可轉換為 bool 的值,而不修改容器:

Version < C++ 11

bool isEven(int val) {
    return (val % 2 == 0); 
}

struct moreThan {
    moreThan(int limit) : _limit(limit) {}
    
    bool operator()(int val) {
        return val > _limit;
    }
    
    int _limit;
};

static const int arr[] = {1, 3, 7, 8};
std::vector<int> v (arr, arr + sizeof(arr) / sizeof(arr[0]) );
    
std::vector<int>::iterator it = std::find_if(v.begin(), v.end(), isEven);
// `it` points to 8, the first even element

std::vector<int>::iterator missing = std::find_if(v.begin(), v.end(), moreThan(10));
// `missing` is v.end(), as no element is greater than 10

Version >= C++ 11

// find the first value that is even
std::vector<int> v = {1, 3, 7, 8};
auto it = std::find_if(v.begin(), v.end(), [](int val){return val % 2 == 0;});
// `it` points to 8, the first even element

auto missing = std::find_if(v.begin(), v.end(), [](int val){return val > 10;});
// `missing` is v.end(), as no element is greater than 10