2012-10-24 106 views
-1

如果我創建了一個載體,與這些結構的64填補它像這樣向量和結構

struct movementType { int x, y , moves;}; 
vector<movementType> myVector(64); 

我怎麼能現在使用的算法類型不是int,雙,字符串等工作。?

讓我們看看fill_n算法。如果你有

vector<int> someOtherVector(64); 

我們可以填補像這樣

fill_n (someOtherVector.begin(),64,20); 

如果我嘗試這與我的movementType載體,我得到一個錯誤

MovementType empty; 
empty.x = 5; 
empty.y = 6; 
empty.moves = 7; 
fill_n (someOtherVector.begin(),64,empty); 

那麼,如何使用STL在我的向量中使用這些類型的算法?

謝謝!

+0

哪裏是'fill_n()'定義和/或它做了什麼? –

+1

@SamIam'std :: fill_n'是C++標準庫中的一種算法。 –

+3

如果您遇到錯誤,請不要只是這麼說,請告訴您發生了什麼錯誤。這會有很大的幫助。 –

回答

0

您可以爲您的類編寫運算符,使其對於您要使用的算法的行爲類似於原始類型,或者在算法使用函數對象執行操作的情況下,編寫lambda或functor類並將它傳遞給算法。

在這種情況下,運營商operator=

struct movementType 
{ 
    int x; 
    int y; 
    int moves; 

    movementType& operator=(int i) 
    { 
     // which member do you want to assign "i" to? 
    } 
}; 
+1

在這種情況下,無需提供賦值運算符。編譯器生成一個很好。 – juanchopanza

+0

編譯器將生成一個'movementType :: opeartor =(const moveType&)',但不會生成'movementType :: operator =(int)'(儘管我首先編寫了'movementType :: operator =(const movementType&)',然後編輯它)。 – user1610015

+1

@ user1610015:你爲什麼認爲他需要一個轉換賦值運算符?問題中沒有什麼讓我覺得這是必要的。 –

0

我的猜測是,你需要提供一個構造函數,以您的結構,這在C++中的行爲非常喜歡的一類。 Somethink像

struct movementType 
{ 
    movementType(int X, int Y, int Moves) : x(X), y(Y), moves(Moves) { } // Constructor with 3 int's 
    movementType(const movementType &MT) : x(MT.x), y(MT.y), moves(MT.moves) { } // Copy constructor 
    int x, y , moves; 
}; 

然後用

fill_n(someOtherVector.begin(),64, movementType(5,6,7)); 
+0

我非常懷疑這與問題有關。 –

+0

@MooingDuck你能否詳細說明一下? – rpsml

+0

他似乎已經正確構建並初始化'movementType'。他似乎在用'運動類型'對象填充'矢量'。 –

1

fill_n (someOtherVector.begin(),64,empty);並沒有太大的意義,你正試圖填補一個vector<int>movementType。如果你想填補一個vector<movementType>下將工作(假定您已經聲明vector<movementType> myVector(64);) :

在C++ 11:

fill_n(myVector.begin(), 64, movementType{1, 2, 3}); 

或C++ 03:

movementType m = {1, 2, 3}; 
fill_n(myVector.begin(), 64, m); 
+0

提問者提到它適用於'vector ',但不適用於'vector '。 –

+0

@sftrabbit:是的,'fill_n(someOtherVector.begin(),64,20);'會正常工作。 –

2

既然你沒有真正說出你得到了什麼錯誤,我們必須猜測解決方案。另外,考慮到this test code works,我認爲你必須在其他地方犯錯。

您是否收到運行時錯誤,如分段錯誤?如果是這樣,那麼問題將是你試圖填充的矢量,someOtherVector沒有足夠的元素。你有沒有把它定義爲std::vector<movementType> someOtherVector(64)或者只是std::vector<movementType> someOtherVectorstd::fill_n將給定值分配給要填充的容器的每個元素,因此如果沒有元素,那麼就有問題。所以確保你的矢量有足夠的元素。

這裏的另一種方法是使用std::back_inserter的元素添加到空載體:

std::vector<movementType> someOtherVector; 
std::fill_n(std::back_inserter(someOtherVector), 64, empty); 

但是,你真的應該只是做:

std::vector<movementType> someOtherVector(64, empty);