c++ - STL 映射值构造函数

标签 c++ stl

我有一个 X 类,我想将其放入 std::map 类型的 STL 映射中。 STL map 需要将 X 存储在内存中的某处,因此我正在寻找一种有效的(运行时和内存)方式来创建 X 并将其存储在 map 中。

我注意到下面的代码,其中 x 是 X 类型的对象,而 STLMap 是 std::map 类型的映射:

stlMap["test"] = x;

调用以下内容的结果:

  1. X 默认构造函数
  2. X拷贝构造函数
  3. X拷贝构造函数
  4. X析构函数
  5. X析构函数
  6. X赋值构造函数
  7. X析构函数

为什么要创建这么多 X 对象?

这是对时间和内存的低效利用吗?

有没有更好的方法将对象放入 map 中?也许将映射更改为字符串到 x* 的映射?

最佳答案

尝试 stlMap.insert( map<string, X>::value_type("test", x) ) :

#include <iostream>
#include <string>
#include <map>

using namespace std;

class X
{
public:
X() { cout << "X default constructor" << endl; }
~X() { cout << "X destructor" << endl; }
X( const X& other ) { cout << "X copy constructor" << endl; }
X& operator=( const X& other ) { cout << "X copy-assignment operator" << endl; }
int x;
};


int main()
{
X x;
map< string, X > stlMap;

cout << "INSERT BEGIN" << endl;
stlMap.insert( map< string, X >::value_type( "test", x ) );
cout << "INSERT END" << endl;
stlMap.clear();
cout << "ASSIGN BEGIN" << endl;
stlMap["test"] = x;
cout << "ASSIGN END" << endl;

return 0;
}

在我的 g++ 上,将事情简化为:

  1. X拷贝构造函数
  2. X拷贝构造函数
  3. X析构函数

编辑:根据 ArunSaha 的建议,更新了测试。 insert() 输出没有改变,而赋值序列如下所示:

  1. X 默认构造函数
  2. X拷贝构造函数
  3. X拷贝构造函数
  4. X析构函数
  5. X析构函数
  6. X复制赋值运算符

关于c++ - STL 映射值构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3771449/

相关文章:

c++ - 使用 cmake 和 Qt4 进行 make 时出现 RCC 解析错误

c++ - 将 1 加到 N,在新行中打印每个总和(递归)

c++ - 即使在执行流程到达包含 while 的函数结束后,while 循环也会无限执行而无需任何递归调用

c++ - 使用 STL vector 而不是运算符 [] 时崩溃

用于连接 std::vector 和 std::array 类型的 C++ 模板函数

c++ - 在 C++ 中使用 ifstream 逐行读取文件

c++ - 在 Windows 窗体中嵌入 GLFW 窗口

c++11 - 使用 emplace 添加到 std::map 时如何避免临时副本?

c++ - 在 C++ STL 中分隔字母字符

C++ 编码逻辑 - 各种想法