map判断key是否存在 - c++ map排序



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

另请参见C ++标准列表和默认构造类型

不是一个主要问题,只是烦人,因为我不希望我的类在没有特定参数的情况下被实例化。

class MyClass
{
public:
    MyClass(MyType1 t);
    MyType2 &operator[](int index);
}

map<int, MyClass> myMap;

这给了我以下g ++错误:

/usr/include/c++/4.3/bits/stl_map.h:419:错误:没有用于调用'MyClass()'的匹配函数

如果我添加一个默认构造函数,这编译很好; 我确信它不是由不正确的语法引起的。

https://src-bin.com


Answer #1

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

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

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

从20.1.4.1开始:

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

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

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

对于特定容器也有其他特定要求,例如可Comparable (例如,对于地图中的键)。

顺便说一句,以下编译没有错误:

#include <map>

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

int main()
{
    std::map<int, MyClass> myMap;
}

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


Answer #2

很可能是因为std :: pair需要它。 std :: pair使用值语义保存两个值,因此您需要能够在没有参数的情况下实例化它们。 因此代码在各个地方使用std :: pair将映射值返回给调用者,这通常通过实例化一个空对并在返回本地对之前将值赋给它来完成。

您可以使用map <int,smartptr <MyClass >>来使用智能指针解决这个问题,但这会增加检查空指针的开销。


Answer #3

检查是否:

  • 你忘记了';' 课后宣布。
  • 应该相应地声明MyType。
  • 那里没有默认构造函数......

我认为std :: map声明似乎是正确的。


Answer #4

运算符[]附带此问题。 从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;




map