代码之家  ›  专栏  ›  技术社区  ›  Cubbi

从作用于映射的算法中调用的函子能接受对而不是值类型吗?

  •  1
  • Cubbi  · 技术社区  · 14 年前

    我试着写一个短函数来反转 std::map<K, V> (我知道升压.bimap,这是为了自我教育),并发现,令我惊讶的是,gcc4.4接受的带有-pedantic-ansi设置的代码被SunCC拒绝为const-incorrect(5.8,2005年起)。

    value_type std::pair<const K, V> ,SunCC坚持要我保持 K transform() for_each() ,以及要传递给的返回值的类型 std::inserter ,据我所知,可能是对的?哪个编译器符合标准?

    #include <iostream>
    #include <iterator>
    #include <map>
    #include <string>
    #include <algorithm>
    template<typename K, typename V>
    std::pair<V, K> flip_pair(const std::pair<K, V>& p) // GCC/MSVC
    //std::pair<const V, K> flip_pair(const std::pair<const K, V>& p) // SunCC
    {
         return std::make_pair(p.second, p.first); // GCC/MSVC
    //     return std::pair<const V, K>(p.second, p.first); // SunCC
    }
    template<typename K, typename V>
    std::multimap<V, K> invert_map(const std::map<K, V>& in)
    {
         std::multimap<V, K> out;
         transform(in.begin(), in.end(), std::inserter(out, out.begin()),
                   flip_pair<K, V>);
         return out;
    }
    void print_pair(const std::pair<int, std::string>& p) // GCC/MSVC
    //void print_pair(const std::pair<const int, std::string>& p) // SunCC
    {
            std::cout << p.first << '\t' << p.second << '\n';
    }
    int main()
    {
         std::map<std::string, int> map;
         map["foo"] = 1; map["bar"] = 2; map["baz"] = 3;
         std::multimap<int, std::string> revmap = invert_map(map);
         for_each(revmap.begin(), revmap.end(), print_pair);
    }
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   James McNellis    14 年前

    VisualC++和G++是正确的; flip_pair<K, V>() const std::pair<K, V>&

    内部 transform , flip_pair<K, V> 正在呼叫。因为传递给该函数的对象是 pair<const K, V> pair<K, V> 已创建( pair .first .second

    此临时文件传递给 翻转对<K,V>()