c++ - 在 C++ 中迭代 std::map 的键/值

标签 c++ templates boost map

我的问题是对 this one 的略微概括。 .为了便于讨论,我将专注于遍历 map 的键。我想要一个通用的辅助函数 key_iterator,它接受一个映射迭代器并返回一个映射键迭代器。例如下面的代码:

#include "key_iterator.hpp"
#include <algorithm>
#include <iostream>
#include <iterator>
#include <map>

int main(int argc, char** argv)
{
    std::map<std::string, int> m;
    m["One"] = 1;
    m["Two"] = 2;
    std::copy(key_iterator(m.begin()), key_iterator(m.end()), std::ostream_iterator<std::string>(std::cout, " "));
    return 0;
}

应该产生以下输出:

One Two

如上述问题的解决方案中所建议,boost::transform_iterator 似乎是实现 key_iterator 的合适起点。对于 key_iterator.hpp,我有一个看起来像这样的中途解决方案:

#pragma once

#include <functional>
#include <map>
#include <boost/iterator/transform_iterator.hpp>

template <typename Key, typename Value>
class KeyGetter : public std::unary_function<std::pair<Key,Value>, Key>
{
public:
    const Key& operator()(const std::pair<Key,Value>& p) const {return p.first;}
};

template<typename Key, typename Value>
boost::transform_iterator<KeyGetter<Key,Value>, typename std::map<Key,Value>::iterator>
key_iterator(typename std::map<Key,Value>::iterator itr)
{
    return boost::make_transform_iterator<KeyGetter<Key,Value>, typename std::map<Key,Value>::iterator>(itr, KeyGetter<Key,Value>());
}

但是对于这个实现,Key 和 Value 类型不会被自动推导出来,我需要手动提供它们以使其编译:

std::copy(key_iterator<std::string,int>(m.begin()), key_iterator<std::string,int>(m.end()), std::ostream_iterator<std::string>(std::cout, " "));

关于如何使它按照我想要的方式工作有什么想法吗?

最佳答案

试试这个:

template <typename Iter>
struct KeyGetter : std::unary_function<typename Iter::value_type,
        typename Iter::value_type::first_type>
{
    const typename Iter::value_type::first_type& operator()
            (const typename Iter::value_type& p) const
        { return p.first; }
};

template<typename Iter>
boost::transform_iterator<KeyGetter<Iter>, Iter> key_iterator(Iter itr)
{
    return boost::make_transform_iterator<KeyGetter<Iter>, Iter>
        (itr, KeyGetter<Iter>());
}

想法是,调用点的函数应该直接在其参数上进行模板化,以避免必须显式指定模板参数。

关于c++ - 在 C++ 中迭代 std::map 的键/值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7087215/

相关文章:

c++ - Pthread + Visual Studio 2013 编译错误

c++ - 在 C++ 中迭代指向实例的指针数组所需的声明

c++ - 返回本地对象的元组

c++ - 如何让 vc++ 和 g++ 在依赖限定类型的类型名方面表现相同?

c++ - 生成一个 boost-python 引用

c - 是否有一个用 C 编写的分词器函数可以完成 boost::escaped_list_separator 的功能?

c++ - char temp[3] =""; 是什么意思?

c++ - ChangeDisplaySettings(NULL, 0) 移动/调整我的窗口

html - 创建 Mandrill html 模板

c++ - 组合 `%` 和可选后缀时,自动属性传播有时不起作用