c++ - 从 std::vector<std::pair<T,U>> 构造一个 std::map<T,U>

标签 c++ c++98

我如何构造一个 std::map<std::string, Foo>来自std::vector<std::pair<std::string, Foo> > ? std::map 似乎可以从输入迭代器构造。

更新

顺便说一句,在将 vector 添加到 map 时,我需要将 vector 中的字符串转换为小写形式。这是因为我希望使用 map 来获取 vector 中内容的排序版本。

最佳答案

每个标准库容器都可以从迭代器范围构造。在你的情况下:

std::map<std::string, Foo> mymap(myvector.begin(), myvector.end());

如果您想添加字符串的小写 版本,您需要通过转换迭代器传递这些值。不幸的是,这并没有包含在标准 C++ 中,但实现起来相当简单。 Boost also includes a version :

// Make the pair's key lower-case
std::pair<std::string, Foo> make_lower(std::pair<std::string, Foo> x) {
    std::transform(x.first.begin(), x.first.end(), x.first.begin(), ::tolower);
    return x;
}

std::map<std::string, int> mymap(
    boost::make_transform_iterator(myvector.begin(), make_lower),
    boost::make_transform_iterator(myvector.end(), make_lower));

Here’s a complete, running demonstration

关于c++ - 从 std::vector<std::pair<T,U>> 构造一个 std::map<T,U>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18588870/

相关文章:

c++ - 如何用 C++ 编写自定义流转换?

c++ - 在 C++98 中将单个字符串写入 cout "thread safe"

c++ - 如何只允许具有特定 value_type 的迭代器?

c++ - 如何创建合适的 makefile

c++ - 动态指向现有或创建新对象

c++ - 类包含与类继承

具有多重继承的 C++ 协变返回类型错误

c++ - 为什么 GCC 允许在 C++ 中使用 round() 即使带有 ansi 和 pedantic 标志?

c++ - OutputIterator 到底是什么以及如何构建一个用于 CGAL Kd_tree::search 的?

c++ - 将 Matlab 生成的二进制字符串转换为 float