首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从作用于map的算法中调用的函数器可以接受pair<K,V>而不是value_type吗?

从作用于map的算法中调用的函数器可以接受pair<K,V>而不是value_type吗?
EN

Stack Overflow用户
提问于 2010-10-05 01:41:38
回答 1查看 200关注 0票数 1

我试着写一个简短的函数来反转std::map<K, V> (我知道boost.bimap,这是为了自我教育),令我惊讶的是,我惊讶地发现,GCC 4.4接受的带有-pedantic -ansi设置的代码被SunCC (5.8,2005年)以常量不正确为由拒绝了。

由于value_typestd::pair<const K, V>,SunCC坚持让我在传递给transform()for_each()的函数的参数中对K类型进行常量限定,并在要传递给std::inserter的返回值的类型中对其进行限定,据我所知,这可能是对的?哪种编译器是符合标准的?

代码语言:javascript
运行
复制
#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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-05 01:48:09

Visual C++和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类型是可转换的,则允许您将一对类型转换为另一对类型)。

这个临时值被传递给flip_pair<K, V>(),这利用了常量引用可以绑定到临时值的事实。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3857716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档