【问题标题】:Efficient lookup on fixed collection of vectors对固定向量集合进行高效查找
【发布时间】:2021-11-18 06:14:10
【问题描述】:

我有一个固定数量 (5) 的结构向量(结构是在运行时插入的,数量可以变化)。 我有一个enum class,它用作查找的键。例如

enum class CountryCode {
  kUS,
  // ...other 4
};

const std::vector<SomeStruct>& get_by_country_code(CountryCode cc);

我可以将std::unordered_map&lt;CountryCode, std::vector&lt;SomeStruct&gt;, CustomHash&gt; 与自定义哈希一起使用,但我认为对于固定大小的集合来说不值得,因为在运行时之前就知道了排序。 存储这 5 个向量并通过 enum 值进行查找的最有效方法是什么?

我也在考虑std::tuple,但在我的情况下,值并不是异类的。

【问题讨论】:

  • 如果枚举数有默认值,就不能用数组吗?
  • @DavisHerring 向量数组是否被认为是一种好习惯?
  • 根据定义,对于具有快速索引查找的固定大小的对象集合,它是适当的数据结构。如果你想花哨,你可以把它们放在std::array,我猜?
  • 为什么需要使用自定义哈希? 散列操作适用于 KEY,而不是 VALUE。 枚举基本上是具有默认散列操作的整数,这非常接近于无操作。所以 unordered_map` 绝对是要走的路。
  • @senloa - 它绝对转换为 int。

标签: c++ c++20


【解决方案1】:

存储这 5 个向量并通过枚举值进行查找的最有效方法是什么?

一个数组。 enum 的默认值为 0,1,... 非常适合作为数组的索引。

唯一的小障碍是枚举类必须显式转换为底层整数。

向量数组是否被认为是一种好习惯?

他们没有什么特别糟糕的做法。


如果向量的大小在同一时间是已知的,并且它们在创建后不会发生变化,那么有一个更有效的解决方案:使用包含所有对象的单个向量国家代码。然后对子向量使用一个跨度数组。

【讨论】:

  • 您能否添加您提到的std::span 案例的代码?谢谢
【解决方案2】:
#include <iostream>
#include <vector>
#include <cstdint>
#include <array>
using namespace std;


const int k_MAX_COUNTRY_CODE = 5;
enum class CountryCode: uint8_t {
    
    COUNTRY_CODE_0 = 0,
    COUNTRY_CODE_1 = 1,
    COUNTRY_CODE_2 = 2,
    COUNTRY_CODE_3 = 3,
    COUNTRY_CODE_4 = 4,
};


void printVector(vector<int>& f_vec){
    for(auto& el : f_vec){
        cout << el << " ";
    }
    cout << "\n";
}

int main() {

    CountryCode l_countryCode;
    array<vector<int>, k_MAX_COUNTRY_CODE> l_lookUP;
    vector<int> l_lookUP(k_MAX_COUNTRY_CODE);

    for(int i = 0; i < k_MAX_COUNTRY_CODE; i++){
        vector<int> tempVec((i+1)*2 , i + 534);
        l_lookUP[i] = tempVec;
    }

    printVector(l_lookUP[static_cast<int>(CountryCode::COUNTRY_CODE_4)]);
    printVector(l_lookUP[static_cast<int>(CountryCode::COUNTRY_CODE_3)]);
    printVector(l_lookUP[static_cast<int>(CountryCode::COUNTRY_CODE_1)]);
    printVector(l_lookUP[static_cast<int>(CountryCode::COUNTRY_CODE_2)]);
    return 0;
}

就像@eerorika 建议的那样,我也会给我们一个快速查找的数组。我希望,这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2015-03-29
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多