我已阅读C ++参考中的地图插入,并在示例中显示以下代码
std::map<char,int> mymap;
mymap.insert (it, std::pair<char,int>('b',300));
同时我看到了与
类似操作的代码mymap.insert( pair<uuid,structval>( (*it).first, structval() ) );
structval本身被声明为普通结构
struct structval {
//some params
};
任何人都可以解释一下为什么启动这对结构我们可以通过使用structval()操作简单地调用结构吗? structval()有什么意义?这是访问结构并将其作为一对结合使用的有效方法吗?
谢谢
答案 0 :(得分:2)
structval()有什么意义?这是访问结构并将其作为一对结合使用的有效方法吗?
structval()
实例化structval
类型的临时对象。因此,从技术上讲,它不是访问结构的方法,而是创建它的实例。是的,这是创建对象实例的有效方法:
struct X
{
X() : i_(42) { }
int i_;
};
void foo(X x) { /* ... */ }
// ...
foo(X()); // <== Valid way to construct a temporary object
// of type X and pass it as an argument to
// the foo() function.
然后,这个临时的,默认构造的实例作为参数传递给std::pair
的构造函数(顺便说一下,你构建的对对象也是临时的!)。
通常,通过调用std::make_pair()
函数来构造对,这可以为您推导出参数的类型,因此您不必明确键入它们。因此,您可以重写:
pair<uuid,structval>( (*it).first, structval() )
如下:
std::make_pair((*it).first, structval())
在C ++ 11中,您还可以使用emplace
成员函数而不是insert()
:
mymap.emplace((*it).first, structval());
这样就不必显式构造对(或为此目的调用std::make_pair()
)。
作为最后的评论,地图的值类型不是:
pair<key_type, mapped_type>
而是:
pair<key_type const, mapped_type>
// ^^^^^
因为永远不会更改地图的键,以防止搞乱容器的内部排序。
答案 1 :(得分:0)
structval()
是对没有参数的structval
类型的构造函数的调用。所以,只需使用临时创建的对象。
相关:在大多数情况下,您应该使用std::make_pair
,而不是呼叫对c-tor。