如何初始化结构字段 std::map<std::string, std::string>称为参数

How to initialize a structure field std::map<std::string, std::string> called params

本文关键字:std string gt 参数 初始化 结构 map lt 字段      更新时间:2023-10-16

我正试图使用std::vector<tokens>中保存的一些数据来初始化一个结构——令牌只是字符串。我的结构是:

struct parsedBlock{
std::string name;
std::map<std::string, std::string> params;
} 
parsedBlock block;

token[0]是block.name,所以只写block.name = tokens[0]很简单但问题是,假设关键字为tokens[i],值为tokens[i+1],如何初始化params字段。提前谢谢。问候!

我猜您的"tokens"向量包含索引0处的名称作为一个特殊值,所有连续的值都是您想要在"params"映射中的键/值。

换句话说,奇数索引(1、3、5等)是"params"映射的键,偶数索引(2、4、6等)-除了0-是"params"映射的值。

假设你的"代币"矢量是正确的,你可以这样做:

for (int i = 1; i < (tokens.size() - 1); i += 2) {
std::string& key = block.params[i];
std::string& value = block.params[i + 1];
block.params.insert(std::pair<std::string, std::string>(key, value));
}

使用(tokens.size()-1),作为"i"可以达到的最大值,可以确保在"tokens"向量有一个键(在奇数索引上)但没有值(在偶数索引上)的情况下不会抛出std::out_of_range异常。

使用std::map::insert()方法只会在映射中不存在键的情况下插入新的键/值对。在映射中插入键/值对并在键已经存在的情况下覆盖该值的另一种方法是使用[]运算符,如下所示:

block.params[key] = value;

附加说明:

  1. 编译器优化应该取消引用创建步骤,直接将"tokens"向量值传递给std::map::insert()方法,通过创建无用但增加可读性的引用来避免多余的开销