【问题标题】:stl vector and c++: how to .resize without a default constructor?stl向量和c++:如何在没有默认构造函数的情况下调整大小?
【发布时间】:2009-11-06 12:00:19
【问题描述】:

我如何告诉 STL,特别是向量中的 resize() 方法,使用默认构造函数以外的构造函数初始化对象,以及使用哪些参数?

例如:

class something {
    int a;
    something (int value);
}

std::vector<something> many_things;

many_things.resize (20);

更一般地,当 STL 需要创建对象并将参数传递给该构造函数时,如何强制 STL 使用我的构造函数?

在我的情况下,添加默认构造函数不是一种选择,我不希望使用指针数组来解决问题。

【问题讨论】:

    标签: c++ stl constructor vector default


    【解决方案1】:

    使用 2 参数重载: many_things.resize(20, something(5));

    【讨论】:

      【解决方案2】:

      我可以想到一个解决方案,但我警告你,它相当难看。我不知道您为什么不想添加默认构造函数,但如果您只是想阻止该类的用户创建未初始化的实例,您可以将默认构造函数设为私有并将适当的向量类声明为朋友:

      class Foo {
      public:
         Foo( int x ) : num( x ) {}
      
         int GetX( ) { return num; }
      private:
         friend class std::vector< Foo >;
      
         int num;
         Foo( ) : num( 10 ) {}
      };
      

      这很丑有几个原因,主要是因为它只适用于一种容器类型。没有其他办法,因为 STL 容器只要求它们的项目是默认可构造的。

      【讨论】:

      • 我发现这不起作用,因为std::vector&lt;Foo&gt; 将构造委托给另一个类,因此友谊变得毫无用处。见here
      • 感谢您的更新!我想这就是你得到的,具体取决于实现细节。 3.5 年前的我 没有经验 :)
      【解决方案3】:

      您可以使用reserve() 增加缓冲区大小并在循环中手动添加 (push_back()) 必要的项目。

      【讨论】:

      【解决方案4】:

      具有类似的专业化(抱歉,我只做了很少的检查就写了这个)?

      #include <vector>
      
      class MyClass
      {
          private:
              MyClass();
          public:
              MyClass(unsigned i) : _data(i) {};
      
          private:
              unsigned _data;
      };
      
      typedef std::vector<MyClass> MyVector;
      
      void MyVector::resize(MyVector::size_type new_size)
      {
          this->resize(new_size, MyClass(5));
      }
      
      int main()
      {
          MyVector vector;
          vector.resize(5);
      
          return 0;
      }
      

      但是想想你是否真的需要它。为什么不创建默认构造函数呢?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-07
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 2020-11-22
        • 2015-07-07
        • 2017-02-14
        • 2017-01-29
        相关资源
        最近更新 更多