假设我们已经std::set<int>
并且我们想要创建一个std::vector<int>
包含该集合的所有值:
std::set<int> set;
std::vector<int> vec( set.begin(), set.end() );
Run Code Online (Sandbox Code Playgroud)
这很简单而优雅.但是,让我说我有一个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));
}
Run Code Online (Sandbox Code Playgroud)
或者,使用boost :: adapters:
#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());
}
Run Code Online (Sandbox Code Playgroud)
或者与上面相同:
auto v = boost::copy_range<std::vector<double> >(boost::adaptors::values(m));
Run Code Online (Sandbox Code Playgroud)
请注意,使用vector的范围构造函数比涉及的解决方案更有效back_inserter
.