我已经阅读了C++引用中关于 map 插入的内容,并在示例中显示了以下代码

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()是什么意思?这是访问结构并将其成对放置的有效方法吗?

谢谢

最佳答案


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())。

最后, map 的值类型不是:
pair<key_type, mapped_type>

反而:
pair<key_type const, mapped_type>
//            ^^^^^

因为永远不要更改 map 的键,以免弄乱容器的内部顺序。

关于c++ - 在C++中插入要配对的结构的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16166012/

10-11 23:13