Mor*_*rse 25 c++ iterator stdmap
我正在尝试在地图中创建地图:
typedef map<float,mytype> inner_map;
typedef map<float,inner_map> outer_map;
Run Code Online (Sandbox Code Playgroud)
我能在内部地图中放置一些东西,或者iterator :: second会返回一个副本吗?
stl_pair.h建议后者:
74: _T2 second; ///< @c second is a copy of the second object
Run Code Online (Sandbox Code Playgroud)
但我的测试程序运行正常,代码如下:
it = my_map.lower_bound(3.1415);
(*it).second.insert(inner_map::value_type(2.71828,"Hello world!");
Run Code Online (Sandbox Code Playgroud)
那真相在哪里?这是副本吗?
Mat*_*her 26
我想为使用C++ 11迭代器的人添加这个问题的后续答案...
以下代码:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (auto i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
不复制键和值,因为"自动"是默认值,而不是一个const引用(至少是它的行为方式铛3.1).
另外,代码:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (const std::pair<std::string,std:string>& i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
还复制键和值,因为正确的代码应该是:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (const auto& i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
要么
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (const std::pair<const std::string,std:string>& i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
Kon*_*lph 25
stl_pair.h在这个具体案例中,评论具有误导性.
将有没有复制,因为map::iterator实际上指的是原始数据的映射(内部value_type,这本身就是一种pair),它不是一个副本.因此iterator::second也指原始数据.