我的文件具有如下所示的值:
[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次。这是我从向量访问数据的方式,最有效的方式或任何其他方式可以更好地做到这一点。预先感谢。
答案 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
中搜索要快。