C++ STL容器和就地构造

Bar*_*ett 8 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;
}
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

构造函数

复制构造函数

现在我的问题是:我如何避免复制构造函数?或者换一种方式:如何在没有不必要的复制操作的情况下在STL容器内创建对象.有没有办法使用默认构造函数进行"就地"构造?


更新 - 答案到目前为止:

  1. 它无法完成
  2. 请改用指针或智能指针.

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


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

int main()
{
  CMyClass Empty;

  std::list<CMyClass> listMyClass;

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

小智 8

按照设计,所有C++标准库容器都存储副本.因此,如果您希望将值存储在容器中,则无法避免对复制构造函数的调用 - 唯一的出路是存储指针.如果要减轻复制的开销,请调查引用计数的使用.