从 std::map 的最后 n 个元素创建 std::vector 的 C++ 惯用方法是什么?
我对保留 vector 中的顺序不感兴趣。
我可以像这样复制元素:
std::map< double, MyType > m;
size_t n = 3;
std::vector< MyType > v;
std::map< double, MyType >::iterator it = m.end();
while ( n-- ) { // assuming m.size() >= n
it--;
v.push_back(it->second);
}
但是,有没有其他更惯用的方法来做到这一点?
最佳答案
std::copy
如果您想复制类型不变,那将是合适的。然而,std::map<T,U>::iterator_type::value_type
不是 U
(您要复制的类型),但是 std::pair<T,U>
(换句话说,取消引用映射迭代器会产生一对键和值类型),因此原始拷贝将不起作用。
因此我们需要复制元素,并在此过程中进行转换。这就是std::transform
是为了。
为方便起见,我假设您的编译器支持 C++11 lambda 表达式和 auto
关键词。如果不是,它可以相当简单地重写为仿函数。但我们正在寻找大致像这样的东西:
std::transform(map_first, map_last, std::back_inserter(vec), [](std::pair<double,MyType> p) { return p.second; });
现在我们只需要填写前两个参数:
auto map_first = std::next(map.end(), -n);
auto map_last = map.end();
这里唯一棘手的部分是 map 迭代器是双向的,但不是随机访问的,所以我们不能简单地说 map.end() - n
. -
运算符未定义。相反,我们必须使用 std::next
(双向运算符需要线性而不是恒定时间,但没有办法解决)。
(注意,我还没有尝试编译这段代码,所以它可能需要一点点调整)
关于c++ - 用于从 std::map 的最后 n 个元素创建 std::vector 的惯用 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9391964/