【问题标题】:What is the best way to get values of a map as a vector?将地图的值作为矢量获取的最佳方法是什么?
【发布时间】:2017-09-11 15:32:19
【问题描述】:

我需要满足一个需要向量的api函数:

void api_function(std::vector<int> vec);

出于另一个原因,我将值保存在一个

std::map<int,int> map;

现在我需要将此映射的值传递给 api_function。

有没有办法在没有太多空间和时间开销的情况下做到这一点,即无需遍历所有值或创建新向量?

【问题讨论】:

    标签: c++


    【解决方案1】:

    不,没有。向量连续存储其元素,而映射则没有,因此如果不进行迭代和复制,就无法创建连续的整数排列。

    (出于这个原因,通用算法不在容器上运行,而是在更灵活的接口(如迭代器)上运行,因此它们不会强制用户提供范围的特定实现。)

    【讨论】:

    • True:不幸的是,我需要使用该 API,并且它没有被抽象为使用迭代器。不过还是谢谢啦。
    【解决方案2】:

    如果一个函数需要向量,你必须给它一个向量。最多对你有帮助Copy map values to vector in STL

    【讨论】:

      【解决方案3】:

      您可以通过在地图上使用简单的范围循环并将每个值推入向量中,然后将其传递给您的函数来做到这一点。

      像这样:

      for (const auto& pair : map)
          vector.push_back(pair.second);
      

      【讨论】:

        【解决方案4】:

        您可能希望使用在内部使用排序向量的地图实现(“密集地图”)。

        【讨论】:

        • 不,它不是std的一部分,所以你必须依赖第三方实现或自己编写。
        【解决方案5】:

        正如 kerrek SB 所说,答案是。您将需要遍历您的地图。

        您可以执行以下操作以将值添加到动态矢量容器。使用std::pair 遍历地图。这样你就没有使用真正的迭代器:

        std::vector<int> vec;
        
        for (std::pair<int, int>& e : map) {
           vec.push_back(e.second);
        }  
        
        ...
        ...
        api_function(vec);  // Invoke function
        

        最后,您可以使用矢量从 API 调用您的函数。

        这将产生 O(n) 的计算时间和空间复杂度(其中“n”是您在 地图中包含的值的数量 )。

        【讨论】:

          猜你喜欢
          • 2017-10-27
          • 1970-01-01
          • 2014-09-21
          • 1970-01-01
          • 2014-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多