以更好的方式访问结构数据

时间:2018-08-16 20:19:20

标签: c++ c++11

我的文件具有如下所示的值:

[A]
Ranges=5
LowRanges=000000000
HighRanges=299999999
Service=01

其中有36个区块。从A到Z,然后从0到9。 我需要读取文件并保存数据以便以后访问。 所以我创建了结构向量。

struct values
{
    uint32_t LowRangesValue;
    uint32_t HighRangesValue;
    int Service;
    string key;
};
vector<values> data;

在主要功能中:

ifstream f("file.txt");
if (f.is_open()){
    values pt;
    for (size_t i = 0; i < 35; i++){
        pt.key = char(65 + i);
        pt.HighRangesValue_[0] = 123456789 + i;
        pt.LowRangesValue_[0] = 222555888 + i;
        pt.Service = 968 + i;
        data.push_back(pt);

    }
    for (size_t i = 0; i < 35; i++){ //is this efficient?
        if (data[i].key == "C"){
            int s = PTNdata[i].Service;
        }
    }
}

问题是,每当我需要此信息时,我都需要使用last循环36次。这是我从向量访问数据的方式,最有效的方式或任何其他方式可以更好地做到这一点。预先感谢。

3 个答案:

答案 0 :(得分:2)

由于范围有限,因此相当简单的解决方案是基于密钥计算索引:

size_t keyToIdx( char k )
{
    if( k >= 'A' and k <= 'Z' ) return k - 'A';
    if( k >= '0' and k <= '9' ) return 26 + k - '0';
    throw std::runtime_error( "invalid key" );
}

然后使用它来访问向量中的元素:

int s = PTNdata[keyToIdx('C')].Service;

无循环。

答案 1 :(得分:2)

如果您始终有36个值,“ A”-“ Z”,“ 0”-“ 9”,那么为什么需要循环访问?它肯定会按顺序存储在向量中(或可以按照这种方式进行排序)。只需具有以下功能,您就可以立即进行查找:

constexpr size_t positionInVector(char val) {
    if (val >= '0' && val <= '9') return 26 + val - '0';
    if (val >= 'A' && val <= 'Z') return val - 'A';
    return std::numeric_limits<size_t>::max(); // obvious error code.
}

要根据您用来输入向量的char值将其获取到向量中。

答案 2 :(得分:0)

std::unordered_map是您需要的。

std::unordered_map<char, values> values_map;

values pt;
// ... populate pt

values_map.insert({'A', pt});

以后您可以在固定时间内访问每个元素:

values pt_c = values_map['c'];

如果需要对键进行排序并按顺序迭代元素,则也可以使用std::map。效率较低,但比在vector中搜索要快。