当前位置:  开发笔记 > 编程语言 > 正文

使用[]时,为什么C++ map类型参数需要空构造函数?

如何解决《使用[]时,为什么C++map类型参数需要空构造函数?》经验,为你挑选了2个好方法。

运算符[]附带此问题.从SGI文档引用:

data_type& operator[](const key_type& k) - 返回对与特定键关联的对象的引用.如果地图尚未包含此类对象,请operator[] 插入默认对象 data_type().

如果您没有默认构造函数,则可以使用insert/find函数.以下示例正常工作:

myMap.insert( std::map< int, MyClass >::value_type ( 1, MyClass(1) ) );
myMap.find( 1 )->second;

优秀的答案 - 请注意C++ 11中的`emplace`作为`insert`的简洁替代. (10认同)

为什么在`insert`调用中存在`std :: <map> :: value_type`? (2认同)


Assaf Lavie.. 6

是.STL容器中的值需要维护复制语义.IOW,它们需要表现得像原始类型(例如int),这意味着,除其他外,它们应该是默认构造的.

如果没有这个(以及其他要求),在实现STL容器的数据结构上实现各种内部复制/移动/交换/比较操作将是不必要的.

在参考C++标准时,我看到我的答案不准确.事实上,默认构造不是必需的:

从20.1.4.1开始:

默认构造函数不是必需的.某些容器类成员函数签名将默认构造函数指定为默认参数.T()必须是明确定义的表达式......

因此,严格来说,如果您恰好使用在其签名中使用默认构造函数的容器函数,则您的值类型只需要是默认构造的.

存储在STL容器中的所有值的实际要求(23.1.3)是CopyConstructibleAssignable.

对于特定容器也存在其他特定要求,例如Comparable(例如,用于地图中的键).


顺便说一句,下面对没有错误编译科莫:

#include 

class MyClass
{
public:
    MyClass(int t);
};

int main()
{
    std::map myMap;
}

所以这可能是一个g ++问题.



1> bayda..:

运算符[]附带此问题.从SGI文档引用:

data_type& operator[](const key_type& k) - 返回对与特定键关联的对象的引用.如果地图尚未包含此类对象,请operator[] 插入默认对象 data_type().

如果您没有默认构造函数,则可以使用insert/find函数.以下示例正常工作:

myMap.insert( std::map< int, MyClass >::value_type ( 1, MyClass(1) ) );
myMap.find( 1 )->second;


优秀的答案 - 请注意C++ 11中的`emplace`作为`insert`的简洁替代.
为什么在`insert`调用中存在`std :: <map> :: value_type`?

2> Assaf Lavie..:

是.STL容器中的值需要维护复制语义.IOW,它们需要表现得像原始类型(例如int),这意味着,除其他外,它们应该是默认构造的.

如果没有这个(以及其他要求),在实现STL容器的数据结构上实现各种内部复制/移动/交换/比较操作将是不必要的.

在参考C++标准时,我看到我的答案不准确.事实上,默认构造不是必需的:

从20.1.4.1开始:

默认构造函数不是必需的.某些容器类成员函数签名将默认构造函数指定为默认参数.T()必须是明确定义的表达式......

因此,严格来说,如果您恰好使用在其签名中使用默认构造函数的容器函数,则您的值类型只需要是默认构造的.

存储在STL容器中的所有值的实际要求(23.1.3)是CopyConstructibleAssignable.

对于特定容器也存在其他特定要求,例如Comparable(例如,用于地图中的键).


顺便说一句,下面对没有错误编译科莫:

#include 

class MyClass
{
public:
    MyClass(int t);
};

int main()
{
    std::map myMap;
}

所以这可能是一个g ++问题.


该代码可能会编译,因为您没有调用myMap []
你认为bb可以关于[]运算符吗?
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有