【问题标题】:How Can I Swap Map Elements without Moving?如何在不移动的情况下交换地图元素?
【发布时间】:2015-04-13 12:26:49
【问题描述】:

如果我有两个 map<string, int>s,我如何交换每个 map 的元素?

例如:

map<string, int> ps{ { "triangle", 0 }, { "cross", 1 }, { "square", 2 }, { "circle", 3 } };
map<string, int> xbox{ { "y", 0 }, { "a", 1 }, { "b", 2 }, { "x", 3 } };

swap(move(ps["cross"]), move(xbox["x"]));

swap 声明显然是错误的,但这解释了我想要做什么。在swap 声明之后,我希望ps 包含:

  • { "triangle", 0 }
  • { "x", 3 }
  • { "square", 2 }
  • { "circle", 3 }

还有xbox 包含:

  • { "y", 0 }
  • { "a", 1 }
  • { "b", 2 }
  • { "cross", 1 }

我希望有一个使用 C++11 的移动语法的好方法,但如果可能的话,我想要一个还描述如何在 C++03 上完成此操作的答案。

【问题讨论】:

  • 你没有用“x”交换“cross”。您正在将“cross”从 ps 移动到 xbox,并将“x”从 xbox 移动到 ps。它们是两个不相关的操作。
  • @NeilKirk 是的,这就是为什么我在问题“交换语句显然是错误的,但这解释了我想要做什么”。将元素移动到相反的map 是我想要做的事情,正如我希望得到的maps 的样子所解释的那样。
  • 我什么都不知道。除非它真的是性能问题,否则我不会担心。在这种情况下,您可能会发现平面地图(我相信 boost 中存在数据结构)可能会更快。

标签: c++ c++11 dictionary swap c++03


【解决方案1】:

map 被实现为有序树。

您不能简单地用新密钥替换密钥,因为它可能必须放在树中的不同位置。因此,您无法交换。

手动删除重新插入 k-v 对。

(作为旁注:你甚至没有告诉我们这些值会发生什么......)

【讨论】:

  • 呃,这就是我正在做的,但它太丑了。我会为这个问题添加价值。
  • 如果可以将地图元素移动到另一个地图而无需复制键(可以轻松移动值),那就太好了。
猜你喜欢
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
相关资源
最近更新 更多