std :: map :: iterator是否返回值或值本身的副本?

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)

  • +1。将元素设为unique_ptr可以清楚地证明这一点,因为您将无法编译访问已删除的函数(复制ctor)。 (2认同)

Kon*_*lph 25

stl_pair.h在这个具体案例中,评论具有误导性.

将有没有复制,因为map::iterator实际上指的是原始数据的映射(内部value_type,这本身就是一种pair),它不是一个副本.因此iterator::second也指原始数据.

  • @xamid好吧它不是*错*因为`stl_pair.h`文档根本没有引用`std :: map`,它的行为与它的行为相同,因为`std :: map :: find`返回a*引用*存储在地图中的`std :: pair`.所以该对的`second`成员仍然是一个值(而不是一个引用),它就是对象本身的引用.文档中的"第二个元素的副本"指的是`std :: pair :: second`包含它在构造函数中传递的任何值的副本. (5认同)