【问题标题】:What is efficient way of transforming map's keyset into vector of keys将地图的键集转换为键向量的有效方法是什么
【发布时间】:2013-05-23 01:48:27
【问题描述】:

将地图的键集转换为键向量的有效方法是什么 目前我正在遍历我的地图并将 iter.first 添加到向量中,这是否类似于 Java 的 KeySet api?

【问题讨论】:

    标签: c++ std stdvector stdmap


    【解决方案1】:

    一种方法是这样的:

    std::vector<KeyType> v;
    std::map<KeyType, ValueType> m;
    
    v.reserve(m.size());
    std::transform(m.begin(), m.end(), std::back_inserter(v), [](const std::pair<KeyType, ValueType>& p) { return p.first; });
    

    【讨论】:

      【解决方案2】:

      如果您已经在使用 boost,Range 库带有一个方便的 map_keys 函数,它不需要临时的 vector

      一种更通用的方法是在 map 迭代器之上放置某种 transform_iterator(本质上就是 Boost.Range 所做的)。

      否则,您复制到向量的方法可以用std::transform 调用来重写。可能在 vector::reserve 之前以减少分配。

      如果您还没有转换迭代器,您可能希望使用最后一个解决方案,因为前两个解决方案很难正确使用,具体取决于您希望与旧标准的兼容性。

      【讨论】:

      • 但是其中哪一个是最快的?
      • @user1393608 基准测试。这实际上取决于您如何使用它:通常迭代向量会比迭代和转换地图更快。同时,当地图发生变化并且需要更多存储空间时,您将需要更新向量,而变换迭代器方法则不需要。底线可能是:这对您的特定应用程序无关紧要。
      • @user1393608:你测量的那个比你测量的另一个更快。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多