在C ++中插入一个结构的值来配对

时间:2013-04-23 09:41:18

标签: c++

我已阅读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()有什么意义?这是访问结构并将其作为一对结合使用的有效方法吗?

谢谢

2 个答案:

答案 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。