【发布时间】:2017-09-11 15:32:19
【问题描述】:
我需要满足一个需要向量的api函数:
void api_function(std::vector<int> vec);
出于另一个原因,我将值保存在一个
std::map<int,int> map;
现在我需要将此映射的值传递给 api_function。
有没有办法在没有太多空间和时间开销的情况下做到这一点,即无需遍历所有值或创建新向量?
【问题讨论】:
标签: c++
我需要满足一个需要向量的api函数:
void api_function(std::vector<int> vec);
出于另一个原因,我将值保存在一个
std::map<int,int> map;
现在我需要将此映射的值传递给 api_function。
有没有办法在没有太多空间和时间开销的情况下做到这一点,即无需遍历所有值或创建新向量?
【问题讨论】:
标签: c++
不,没有。向量连续存储其元素,而映射则没有,因此如果不进行迭代和复制,就无法创建连续的整数排列。
(出于这个原因,通用算法不在容器上运行,而是在更灵活的接口(如迭代器)上运行,因此它们不会强制用户提供范围的特定实现。)
【讨论】:
如果一个函数需要向量,你必须给它一个向量。最多对你有帮助Copy map values to vector in STL。
【讨论】:
您可以通过在地图上使用简单的范围循环并将每个值推入向量中,然后将其传递给您的函数来做到这一点。
像这样:
for (const auto& pair : map)
vector.push_back(pair.second);
【讨论】:
您可能希望使用在内部使用排序向量的地图实现(“密集地图”)。
【讨论】:
正如 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”是您在 地图中包含的值的数量 )。
【讨论】: