std::map 是否从其 const 引用创建对象的新非 const 副本
Is std::map creating a new non const copy of object from its const reference
考虑以下代码。
#include <iostream>
#include <map>
class A{
public:
int m_id;
int m_x;
int m_y;
A() = default;
A(int i, int j, int k) : m_id(i), m_x(j), m_y(k){}
};
void add(const A& a, std::map<int,A>& m){
m[a.m_id] = a;
}
void modify(std::map<int,A>& m){
for(auto& x : m){
x.second.m_x*=10;
x.second.m_y/=10;
}
}
void print(std::map<int,A>& m){
for(const auto& x : m){
std::cout << x.first << " : (" << x.second.m_x << ',' << x.second.m_y << ")\n";
}
std::cout << '\n';
}
int main(int argc, char const *argv[])
{
std::map<int,A> m;
A a(1,10,100);
add(a,m);
print(m);
{
A b(2,10,200);
add(b,m);
print(m);
}
modify(m);
print(m);
return 0;
}
我正在创建 std::map
个 A
类型的对象。在 add
中,我通过使用对该对象的 const
引用将对象添加到 std::map
。在 modify
中,我正在修改 std::map
的值。 print
,我正在打印地图。基本上访问元素。
我在不同的范围内添加 b
以测试它是否出现内存错误。
该代码工作正常。
我的问题是,std::map
和 []
运算符是否创建了一个新的非 const
对象副本?此外,std::vector::push_back
工作正常。 push_back
是否也创建一个副本。我不打电话给 emplace
.
是的,将构造一个新对象作为std::map
的元素。确切地说,在m[a.m_id] = a;
中,如果key(即a.m_id
)不存在,则首先构造一个值初始化的A
作为m
的新元素, 然后 m[a.m_id]
returns 对新元素值的引用;稍后通过 A
的复制赋值运算符从 a
复制赋值。
如果键(即a.m_id
)已经存在,m[a.m_id]
只是returns对已存在元素值的引用;这是从 a
then.
复制分配的
考虑以下代码。
#include <iostream>
#include <map>
class A{
public:
int m_id;
int m_x;
int m_y;
A() = default;
A(int i, int j, int k) : m_id(i), m_x(j), m_y(k){}
};
void add(const A& a, std::map<int,A>& m){
m[a.m_id] = a;
}
void modify(std::map<int,A>& m){
for(auto& x : m){
x.second.m_x*=10;
x.second.m_y/=10;
}
}
void print(std::map<int,A>& m){
for(const auto& x : m){
std::cout << x.first << " : (" << x.second.m_x << ',' << x.second.m_y << ")\n";
}
std::cout << '\n';
}
int main(int argc, char const *argv[])
{
std::map<int,A> m;
A a(1,10,100);
add(a,m);
print(m);
{
A b(2,10,200);
add(b,m);
print(m);
}
modify(m);
print(m);
return 0;
}
我正在创建 std::map
个 A
类型的对象。在 add
中,我通过使用对该对象的 const
引用将对象添加到 std::map
。在 modify
中,我正在修改 std::map
的值。 print
,我正在打印地图。基本上访问元素。
我在不同的范围内添加 b
以测试它是否出现内存错误。
该代码工作正常。
我的问题是,std::map
和 []
运算符是否创建了一个新的非 const
对象副本?此外,std::vector::push_back
工作正常。 push_back
是否也创建一个副本。我不打电话给 emplace
.
是的,将构造一个新对象作为std::map
的元素。确切地说,在m[a.m_id] = a;
中,如果key(即a.m_id
)不存在,则首先构造一个值初始化的A
作为m
的新元素, 然后 m[a.m_id]
returns 对新元素值的引用;稍后通过 A
的复制赋值运算符从 a
复制赋值。
如果键(即a.m_id
)已经存在,m[a.m_id]
只是returns对已存在元素值的引用;这是从 a
then.