c++ - 为什么在 STL 映射中用作值的类需要在...中有一个默认构造函数?

标签 c++ dictionary stl default-constructor

下面是在映射中用作值的类:

class Book
{
    int m_nId;
public:
    // Book() { }  <----- Why is this required?
    Book( int id ): m_nId( id ) { }

};

在 main() 中:

map< int, Book > mapBooks;

for( int i = 0; i < 10; ++i )
{
    Book b( i );
    mapBooks[ i ] = b;
}

导致错误的语句是:

mapBooks[ i ] = b;

如果我添加默认构造函数,则不会出现错误。但是,我不明白为什么需要。谁能解释一下?如果我使用 insert(),问题就不会出现。

对了,我是用Visual C++ 2008编译的。

最佳答案

operator[] 执行一个两步过程。首先,它为给定的键找到或创建一个映射条目,然后它返回对条目的值部分的引用,以便调用代码可以读取或写入它。

在entry之前不存在的情况下,需要default构造entry的value half,然后再赋值。这正是界面需要工作以与条目已存在的情况保持一致的方式。

如果需要在 map 中使用这样的类型,则必须通过使用 findinsert 来避免使用 operator[] “手动”。

关于c++ - 为什么在 STL 映射中用作值的类需要在...中有一个默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2346797/

相关文章:

c++ - 为什么具有虚函数的 C++ 类需要具有非平凡的复制构造函数?

c++ - 更改 C++ vector 的保留内存

c++ - 在 C++ 中,如何使用模板函数作为 std::for_each 中的第三个参数?

c++ - 在 map/unordered_map 中使用 find 与 at

c++ - 字符串运算符 += 有时在 string::resize() 之后不起作用

python - 从回文到非回文的字典?

javascript - AJAX 实时搜索 txt 文件中的字典?

c++ - 更好的计数方法?

c++ - GetMessage/PeekMessage - 删除消息队列中的所有消息

swift - 在 Swift 中使用 reduce() 构建字典