1

我已经阅读了地图插入的 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() 操作来调用结构?structval() 是什么意思?这是访问结构并将其成对放置的有效方法吗?

谢谢

4

2 回答 2

2

structval() 是什么意思?这是访问结构并将其成对放置的有效方法吗?

structval()实例化一个临时对象类型structval。因此,从技术上讲,它不是访问 struct的方法,而是创建它的实例。是的,这是创建对象实例的有效方法:

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(顺便说一下,您正在构造的对对象也是临时的!)。

通常,pairs 是通过调用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>
//            ^^^^^

因为地图的键永远不能改变,以防止弄乱容器的内部顺序。

于 2013-04-23T09:43:46.310 回答
0

structval()structval是对无参数类型的构造函数的调用。因此,只需使用临时创建的对象。

相关:在大多数情况下,您应该使用std::make_pair, 而不是调用对 c-tor。

于 2013-04-23T09:43:15.310 回答