c++ - 用于从 std::map 的最后 n 个元素创建 std::vector 的惯用 C++

标签 c++ vector map idioms

从 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/

相关文章:

r - 如何继续删除第一个值,直到向量的总和小于 20?

地址的 API -> 学区查找?

c++ - omn​​et++ 免费 ( ) : invalid pointer, 错误 134/139

c++ - 检查多个字符串是否为空并打印它们的名称

c++ - Windows 上的 VSCode : gdb doesn't break on 'throw' but breaks on regular exceptions

c++ - 通过函数按引用传递 vector

matlab - 从向量中提取值并根据其原始序列对它们进行排序

java - java程序中与Map相关的错误

iOS 和基本离线应用程序

c++ - Boost_chrono lib 未安装