C++ 将贴图的键集转换为键向量的有效方法是什么

C++ 将贴图的键集转换为键向量的有效方法是什么,c++,std,stdvector,stdmap,C++,Std,Stdvector,Stdmap,将贴图的键集转换为键向量的有效方法是什么 目前,我正在迭代我的映射并将iter.first添加到vector中,这与Java的KeySet api类似吗?一种方法是这样: 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::pa

将贴图的键集转换为键向量的有效方法是什么
目前,我正在迭代我的映射并将iter.first添加到vector中,这与Java的KeySet api类似吗?

一种方法是这样:

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; });

一种方法是这样:

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; });

如果您已经在使用boost,那么范围库附带了一个方便的函数,它消除了对临时向量的需要

一种更通用的方法是在映射迭代器之上放置某种类型的transform_迭代器,这本质上就是Boost.Range所做的

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


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

如果您已经在使用boost,范围库附带了一个方便的函数,它消除了对临时向量的需要

一种更通用的方法是在映射迭代器之上放置某种类型的transform_迭代器,这本质上就是Boost.Range所做的

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


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

但其中哪一个是最快的?@user1393608 Benchmark。这实际上取决于您如何使用它:一般来说,在向量上迭代要比在映射上迭代和变换快。同时,当映射发生变化并且需要更多存储时,您需要更新向量,而变换迭代器方法则不需要。可能底线是:这对您的特定应用程序不重要。@user1393608:您测量并发现的一个比您也测量过的其他应用程序快。但是这些应用程序中哪一个最快?@user1393608 Benchmark。这实际上取决于您如何使用它:一般来说,在向量上迭代要比在映射上迭代和变换快。同时,当映射发生变化并且需要更多存储时,您需要更新向量,而变换迭代器方法则不需要。可能底线是:这对您的特定应用程序不重要。@user1393608:您测量并发现的一个比您还测量的其他应用程序更快。