【问题标题】:What is the fastest way of turning map (value,index) into vector (index,value) in C++?在 C++ 中将 map (value,index) 转换为 vector (index,value) 的最快方法是什么?
【发布时间】:2017-01-02 17:01:16
【问题描述】:

我有一张地图,我想将其转换为矢量。但我也想翻转键和值;并根据新键对它们进行排序。但是,它必须尽可能快,而其中包含大约 300.000 个元素。

为了更好的解释:

地图:

a->5
b->3
c->4
d->2
e->6
f->1

向量应该是这样的->[f,d,b,c,a,e]

一个循环可以吗?

【问题讨论】:

  • 性能最快还是编码时间最快?
  • 取决于您对“一个循环”的解释。无论如何:您的键和值都是整数,对吧?因为你显示的 a b c 有点令人困惑。
  • 不,实际上值是包含 3 个浮点值的点
  • 搜索c++ map sort by value,关于这个话题有几个问答。
  • 您想如何处理原始地图中的重复整数值,或者它们是否保证唯一? (在您的示例中,它们成为向量的索引。)

标签: c++ dictionary vector


【解决方案1】:

其实很简单。假设地图值是字符串,您可以这样做:

std::vector<std::string> myVector(myMap.size());
for (auto const& mapEntry : myMap) {
    myVector[mapEntry->second - 1] = mapEntry->first;
}

但是没有检查索引值。您必须确保(排序时)这些是从 1 开始的连续整数。这当然不能由地图本身保证。可能存在重复或空白。

编辑:刚刚注意到您在评论中写道,这些值是具有三个浮点坐标的点。然后只需将我的代码中的std::string 替换为您的点类型。我只想补充一点,使用浮点值作为映射键通常不是一个好主意,因为可能存在舍入错误。但这与你的问题无关。

【讨论】:

    【解决方案2】:

    这是一个解决方案(需要 C++11)。

    #include #include #include #include #include #include 使用标准::字符串; 使用标准::地图; 使用标准::向量; 主函数() { map m = {{'a',5},{'b',3},{'c',4},{'d',2},{'e',6},{ 'f',1}}; 向量<:pair> > v{ std::make_move_iterator(m.begin()), std::make_move_iterator(m.end())}; std::sort(v.begin(), v.end(), [](std::pair& l, std::pair& r) { 返回 l.second 键; std::transform(v.begin(), v.end(), std::back_inserter(keys), [](std::pair & a){ 返回 a.first;}); 对于(自动一个:键){ std::cout

    你也可以在here运行它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2021-12-16
      • 2022-01-24
      • 2015-03-22
      • 2016-07-14
      • 1970-01-01
      相关资源
      最近更新 更多