在类构造函数中设置std :: vector,使用元素构造函数的不同值

Mar*_*ott 3 c++ constructor vector c++11

我有一个非常简单的构造函数的类:

class mystream
{
public:
    mystream(size_t buffersize,size_t index) : buffersize(buffersize),index(index){}

    size_t buffersize;
    size_t index;
};
Run Code Online (Sandbox Code Playgroud)

mystream实例具有唯一的id,它与其在管理类的向量中的位置相对应:

class mystreammanager
{
public:
   mystreammanager() : streams(8,1024, /* WHAT TO DO HERE ??? */ )
   {
   }

  std::vector<mystream> streams;
};
Run Code Online (Sandbox Code Playgroud)

如何构造向量并使用索引的升序值初始化其元素?

Ric*_*ges 8

一个简洁,清晰且易于调试的方法是将向量的构造推迟到静态类函数:

class mystreammanager
{
public:
   mystreammanager() : streams{ generate_streams(1024, 8) }
   {
   }

private:
  static std::vector<mystream> generate_streams(size_t buffersize, size_t qty)
  {
    std::vector<mystream> result;
    result.reserve(qty);
    for(size_t i = 0 ; i < qty ; ++qty) {
      result.emplace_back(buffersize, i); 
    }
    return result;
  } 

  std::vector<mystream> streams;
};
Run Code Online (Sandbox Code Playgroud)

这是最佳效率,因为:

  1. RVO使得载体就地构建
  2. 避免列表初始化意味着没有冗余副本.

  • @MartinSchlott:如果你的团队无法阅读简单的功能,那么你需要一个新的团队. (5认同)
  • @MartinSchlott如果您有多个向量,您必须特别注意,那么我认为更有理由将构造推迟到单独的函数. (2认同)