簡體   English   中英

STL向量和C ++:如何在沒有默認構造函數的情況下調整大小?

[英]stl vector and c++: how to .resize without a default constructor?

如何告訴STL(專門針對vector中的resize()方法resize()使用除默認值以外的構造函數以及哪些參數初始化對象?

例如:

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

std::vector<something> many_things;

many_things.resize (20);

更一般而言,當STL需要創建對象並將參數傳遞給該構造函數時,如何強制STL使用其構造函數?

就我而言,添加默認構造函數不是一種選擇,並且我不希望使用指針數組來解決該問題。

使用2參數重載: many_things.resize(20, something(5));

我能想到一個解決方案,但警告您,這很丑陋。 我不知道為什么您不想添加默認的構造函數,但是如果您只是想阻止該類的用戶創建未實例化的實例,則可以將默認的構造函數設為私有,並將適當的向量類聲明為好友:

class Foo {
public:
   Foo( int x ) : num( x ) {}

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

   int num;
   Foo( ) : num( 10 ) {}
};

這很難看,原因有幾個,主要是因為它僅適用於一種容器類型。 沒有其他方法,因為STL容器僅要求其項是默認可構造的。

您可以使用reserve()增加緩沖區大小,並在循環中手動添加( push_back() )必要的項。

與專業化一樣(抱歉,我只用很少的支票就寫了這個)?

#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;
}

但是,請考慮是否真的需要它。 為什么不創建默認構造函數呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM