C++ STL 容器和就地构造

标签 c++ stl

请考虑以下事项:

class CMyClass
{
public:
  CMyClass()
  {
    printf( "Constructor\n" );
  }
  CMyClass( const CMyClass& )
  {
    printf( "Copy constructor\n" );
  }
};

int main()
{
  std::list<CMyClass> listMyClass;

  listMyClass.resize( 1 );

  return 0;
}

它产生以下输出:

Constructor

Copy constructor

现在我的问题是:如何避免复制构造函数?或者换句话说:如何在没有不必要的复制操作的情况下在 STL 容器内创建对象。有什么方法可以使用默认构造函数进行“就地”构造吗?


更新 - 到目前为止的答案:

  1. 做不到
  2. 使用指针或智能指针 相反。

智能指针对我的应用程序来说太过分了。但我真的很想知道为什么这不能做到。想要做这件事似乎是一件显而易见的事情。还有其他想法吗?如果它有效,我什至会接受一个讨厌的 hack...


解决方案

我想我只是从这里提出的所有评论和答案中找到了解决我的问题的方法。解决方案是构造一个空对象并将其保留,唯一目的是稍后使用它来制作干净的拷贝。然后您可以使用其中一种获取引用的方法(如 push_back 或 insert)。这仍然为每个插入的新对象调用复制构造函数,但至少它不是默认构造函数和复制构造函数:

int main()
{
  CMyClass Empty;

  std::list<CMyClass> listMyClass;

  for ( int c=0; c<10; ++c )
  {
    listMyClass.push_back( Empty );
  }

  return 0;
}

最佳答案

按照设计,所有 C++ 标准库容器都存储拷贝。因此,如果您希望在容器中存储值,则无法避免调用复制构造函数——唯一的出路是存储指针。如果您想减轻复制的开销,请研究引用计数的使用。

关于C++ STL 容器和就地构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2100239/

相关文章:

C++ 将 "struct"类型的参数作为引用(和)传递或按值传递

c++ - 为什么我需要在分配时用()初始化动态分配的数组?

c++ - 定义的改变

c++ - C++ 中真正的编译时字符串散列

c++ - 将 deque 或 LIFO 容器转换为 std::vector

c++ - 遍历不同类型集合的通用代码

c++ - 创建自定义 std::streambuf

c++ - 对 vector 内的值进行排序时,排序方法会生成错误

c++ - 纯虚拟 C++ 编码的优点和缺点

c++ - 将混合数据文件读入 C++ 字符串