将Initializer Lists与std::map一起使用
Using Initializer Lists with std::map
我之前问了一个问题,这个问题偏离了CString和Unicode问题的主题
现在,我已经将示例简化为namespace std
和cout
(而不是printf
)
但核心问题仍然存在。
这与指定为重复的问题有关,但与此问题不同。这个问题是关于地图中的地图的,已经有2年多的历史了,请注意,这个问题是编译器团队的优先事项。(显然这不是优先事项)
这个问题值得继续讨论
我是否正确使用初始化程序
有没有什么简单的方法可以在没有主要解决方法的情况下解决这个问题
(这是一个基于更复杂程序的最小示例)
#include <map>
#include <string>
#include <iostream>
struct Params
{
int inputType;
std::string moduleName;
};
int main()
{
std::map<std::string, Params> options{
{ "Add", { 30, "RecordLib" } },
{ "Open", { 40, "ViewLib" } },
{ "Close", { 50, "EditLib" } },
{ "Inventory", { 60, "ControlLib"} },
{ "Report", { 70, "ReportLib" } }
};
for (const auto& pair : options)
{
std::cout << "Entry: " << pair.first << " ==> { " << pair.second.moduleName << " }" << std::endl;
}
return 0;
}
输出
Entry: ==> { }
Entry: Report ==> { }
您只能看到最后一个幸存的字符串"Report"
在我看来,std::map
的初始化器列表确实被破坏了。
我使用的是带有Unicode的Microsoft Visual Studio 2013
这种情况在Debug
和Release
构建中都会发生,其中Optimizations Disabled
或/O2
相同的代码在IDEOne
在斯拉瓦的坚持下,我与ctors合作找到了一个简单的解决方案:
#include <map>
#include <string>
#include <iostream>
struct Params
{
int inputType;
std::string moduleName;
Params(const int n, const std::string& s) :
inputType(n),
moduleName(s)
{ }
};
int main()
{
std::map<std::string, Params> options = {
{ "Add", Params(30, "RecordLib" ) },
{ "Open", Params(40, "ViewLib" ) },
{ "Close", Params(50, "EditLib" ) },
{ "Inventory", Params(60, "ControlLib") },
{ "Report", Params(70, "ReportLib" ) }
};
for (const auto& pair : options)
{
std::cout << "Entry: " << pair.first << " ==> { " << pair.second.moduleName << " }" << std::endl;
}
return 0;
}
然而,最初的代码应该是有效的,而且显然是微软公认的错误。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- 如何最好地将 emplace 与 std::map 一起使用
- 如何将"std::lower_bound"与"std::map"一起使用?
- 类模板参数扣除是否可与STD :: MAP一起使用
- 将 boost odeint 与 std::map 和自定义向量空间代数一起使用时,没有可行的重载'='
- 与 map 一起使用时复制构造函数常量错误
- 将 SWIG 与 C++ 的 std::map 一起使用时没有 Java 迭代器
- 为什么迭代器在与map.begin()一起使用时预先增加了
- 将Initializer Lists与std::map一起使用
- 如何将std::map与没有默认构造函数的值一起使用?
- 我如何使std::find_if和std::map使用一些boost库一起工作
- 何时将node_type与std::map::insert一起使用
- 为什么我不能将 gtest ValuesIn 生成器与 std::map 一起使用?