为啥移动 std::map 无法将元素从一个地图移动到另一个地图
Posted
技术标签:
【中文标题】为啥移动 std::map 无法将元素从一个地图移动到另一个地图【英文标题】:Why move on std::map is failing to move a element from one map to other为什么移动 std::map 无法将元素从一个地图移动到另一个地图 【发布时间】:2020-06-20 04:31:17 【问题描述】:我正在尝试练习如何将一个地图元素移动到另一个 - 因此我尝试了以下代码:
using namespace std;
int main(void)
/* Initializer_list constructor */
map<char, int> m =
'a', 1,
'b', 2,
'c', 3,
'd', 4,
'e', 5,
;
cout << "Move element from one map to another" << endl;
/*
char temp;
temp = map1[key1];
map2[key1]=temp;
map1.erase(key1)
*/
string a = "hello";
string b = move(a);
cout << "a=" << a << " b=" << b << endl; // here string **a** is NULL as value is moved
auto s = move(m['a']);
cout << "s=" << s << " m=" << m['a'] << endl; // here
输出:
Move element from one map to another
a= b=hello
s=1 m=1
为什么 std::map STL 容器的移动操作失败 - 我期待在 m['a'] 之后会为空?
【问题讨论】:
这能回答你的问题吗? What lasts after using std::move c++11 【参考方案1】:您的代码无法从地图中移除对象。这将需要在地图上进行操作,而不是其中的对象。对地图中的对象进行的任何操作都不会从地图中删除该对象。
您对地图中的对象执行的操作是将其值从中移出。对象移出后的状态是合法但不确定的。
所以地图中的对象处于有效但不确定的状态。
【讨论】:
但是我们在移动到字符串对象之后也没有做 - 为什么我们明确需要从地图中删除或删除? @Programmer 如果要从地图中删除对象,则必须在地图上执行某种“删除对象”操作。对对象的任何操作都不会将其从地图中删除,因为该对象对地图一无所知。 好吧,如果我这样做:auto s = move(m); - 这是将地图移动到另一个地图变量的正确方法吗? @Programmer 如果您尝试从地图中删除对象,则必须在地图上执行某种“删除对象”操作。将对象的值移出对象不会从地图中删除对象。将移动视为x = y;
的优化版本,适用于您不需要将值也包含在 y
中的情况。【参考方案2】:
为什么
std::map
STL 容器的移动操作失败 - 我原以为m['a']
之后会为空?
这种期望是没有根据的。
声明
auto s = move(m['a']);
出于几个原因保留m['a']
。
该语句可以被认为是:
int&& s = move(m['a']);
即它只是捕获对地图中对象的引用。它实际上并没有移动它。
int
上的移动操作不会改变被移动的对象。移动语义仅对类的移动构造函数有意义。对于内置类型,这是一个 noop。即使对于实际上不获取成员变量之外的任何资源的类,移动构造函数也无能为力。
另外,没有空的int
这样的东西。空的概念只对容器有意义。
【讨论】:
以上是关于为啥移动 std::map 无法将元素从一个地图移动到另一个地图的主要内容,如果未能解决你的问题,请参考以下文章
从嵌套在 std::map 中的 std::list 中删除元素的最佳方法