2012-09-05 22 views
0

我有一個2D矢量,如下面的類定義。請注意,我已經使用了類,因爲我試圖對遺傳算法進行編程,以便創建許多許多2D矢量,並且它們都會有所不同。使用類的2D矢量值替換;遺傳算法突變

class Quad: public std::vector<int> 
{ 
    public: 
    Quad() : std::vector<int>(4,0) {} 
}; 

class QuadVec : public std::vector<Quad> 
{ 
}; 

我的算法的一個重要組成部分,但是,是我需要能夠在一定數目的隨機選擇的2D矢量爲「突變」(隨機地改變)的特定值。這讓我難住。我可以很容易地編寫代碼來隨機選擇2D矢量中將被選擇用於「突變」的值,但我如何使用類真正實現這種改變?我明白如何用一個已經初始化的2D矢量完成這個工作,但是如果沒有,我該怎麼做?

請讓我知道,如果我沒有提供足夠的信息或不清楚,因爲我傾向於這樣做。

感謝您的時間和幫助!

+0

看一看此鏈接:http://stackoverflow.com/questions/4353203/你不應該繼承自stdvector – juanchopanza

回答

0

正如在評論中已經指出的那樣,從C++中繼承std::vector被認爲是不好的做法,除非有極少數情況需要它(請閱讀鏈接瞭解更多細節)。從你的問題,下面可能是你在找什麼:

typedef std::vector<std::vector<int>> twodvec; // Create a typedef 
twodvec vec1(10, std::vector<int>(4, 0)); // Create twodvec which holds 10 quads 
twodvec vec2(20, std::vector<int>(4, 0)); // Create twodvec which holds 20 quads 
vec1[0][0] = 1; // Use subscripts to assign values to the preallocated memory 
vec2[0][1] = 2; 

使用push_back如果你還沒有預分配的內存。由於您的課程似乎沒有添加任何額外的功能,因此您似乎只需要完成類似於上述內容的任何操作。

要更新的答案顯示組成:

class QuadVec 
{ 
    std::vector<std::vector<int>> twodvec; // private 
public: 
    QuadVec() : twodvec(10, std::vector<int>(4, 0)) 
    {} 
    int& operator()(std::size_t row, std::size_t col) 
    { 
     // checking for out-of-bound indexes would be good to 
     return twodvec[row][col]; 
    } 
}; 

然後更新QuadVec這樣的:

QuadVec v; 
v(0, 0) = 1; 
+0

那麼,我需要一些時間來閱讀發佈的鏈接。然而,我所說的類實際上會有很多額外的功能。 – gcolumbus

+0

@gcolumbus:在這種情況下,使用組合而不是繼承並添加功能來訪問底層2d矢量。 –

+0

我的歉意。我對編程不太熟悉。你能指點我一個你指的是什麼樣的例子嗎? – gcolumbus