假设我们有 std::set<int>
我们想创建一个 std::vector<int>
使用该集合中的所有值:
std::set<int> set;
std::vector<int> vec( set.begin(), set.end() );
这简单而优雅。但是假设我有一个 std::map<std::string,int>
我想将所有值复制到 std::vector<int>
.不幸的是,没有接受迭代器和转换器函数范围的构造函数。为什么没有提供这样的构造函数?有没有另一种简单而优雅的方法来初始化具有不同类型值的容器?
最佳答案
使用变换迭代器:
#include <boost/iterator/transform_iterator.hpp>
#include <vector>
#include <map>
int main() {
std::map<int, double> m;
auto f = [](auto&& pair) { return pair.second; };
std::vector<double>(boost::make_transform_iterator(m.begin(), f),
boost::make_transform_iterator(m.end(), f));
}
或者,使用 boost::adaptors:
#include <boost/range/adaptor/map.hpp>
#include <vector>
#include <map>
int main() {
std::map<int, double> m;
auto range = boost::adaptors::values(m);
std::vector<double>(range.begin(), range.end());
}
或者同上:
auto v = boost::copy_range<std::vector<double> >(boost::adaptors::values(m));
请注意,使用 vector 的范围构造函数比涉及 back_inserter
的解决方案更有效。
关于c++ - 使用不同类型容器的迭代器范围初始化容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32377304/