簡體   English   中英

C ++按值獲取數組元素的索引

[英]C++ get index of element of array by value

到目前為止,我已經將數組存儲在向量中,然后循環遍歷向量以找到匹配元素,然后返回索引。

有沒有更快的方法在C ++中執行此操作? 我用來存儲數組的STL結構對我來說並不重要(它不一定是矢量)。 我的數組也是唯一的(沒有重復元素)和有序(例如,及時的日期列表)。

由於元素已排序,您可以使用二進制搜索來查找匹配元素。 C ++標准庫有一個std::lower_bound算法,可用於此目的。 為了清晰和簡單,我建議將其包裝在您自己的二進制搜索算法中:

/// Performs a binary search for an element
///
/// The range `[first, last)` must be ordered via `comparer`.  If `value` is
/// found in the range, an iterator to the first element comparing equal to
/// `value` will be returned; if `value` is not found in the range, `last` is
/// returned.
template <typename RandomAccessIterator, typename Value, typename Comparer>
auto binary_search(RandomAccessIterator const  first,
                   RandomAccessIterator const  last,
                   Value                const& value,
                   Comparer                    comparer) -> RandomAccessIterator
{
    RandomAccessIterator it(std::lower_bound(first, last, value, comparer));
    if (it == last || comparer(*it, value) || comparer(value, *it))
        return last;

    return it;
}

(C ++標准庫有一個std::binary_search ,但它返回一個bool :如果范圍包含該元素,則為true ,否則為false 。如果你想要一個元素的迭代器,它就無用了。)

一旦有了元素的迭代器,就可以使用std::distance算法來計算范圍內元素的索引。

這兩種算法同樣適用於任何隨機訪問序列,包括std::vector和普通數組。

如果要將值與索引關聯並快速查找索引,可以使用std::mapstd::unordered_map 您還可以將這些與其他數據結構(例如std::liststd::vector )組合,具體取決於您要對數據執行的其他操作。

例如,在創建矢量時,我們還創建了一個查找表:

vector<int> test(test_size);
unordered_map<int, size_t> lookup;
int value = 0;
for(size_t index = 0; index < test_size; ++index)
{
    test[index] = value;
    lookup[value] = index;
    value += rand()%100+1;
}

現在只需查看索引:

size_t index = lookup[find_value];

使用基於哈希表的數據結構(例如,unordered_map)是一個相當經典的空間/時間權衡,並且當您需要進行大量查找時,可以勝過執行這種“反向”查找操作的二進制搜索。 另一個優點是它在矢量未排序時也有效。

為了好玩:-)我在VS2012RC中做了一個快速的基准測試,將James的二進制搜索代碼與線性搜索進行比較,並使用unordered_map進行查找,所有這些都在一個向量上: 各種查找索引方法的性能

至少50000個元素unordered_set顯着(x3-4)優於顯示預期的O(log N)行為的二分搜索,有點令人驚訝的結果是unordered_map失去了超過10000個元素的O(1)行為,可能是由於哈希沖突,也許是一個實施問題。

編輯:無序映射的max_load_factor()為1,因此不應該發生沖突。 對於非常大的向量,二進制搜索和哈希表之間的性能差異似乎與緩存相關,並且根據基准中的查找模式而變化。

在std :: map和std :: unordered_map之間進行選擇,討論了有序和無序映射之間的區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM