2012-01-07 56 views
0

我創建了一個類「螢火蟲」類似這樣的問題:兩個約矢量使用

class firefly{ 

private: 

    float time_flash; 

public: 

firefly(int, int, float, float);//parametric constr. 
firefly(); 
firefly(const firefly& a);//copy constructor 

void receive_flash(std :: vector<firefly>&, float, float, int); 
friend bool operator <(const firefly&) const; 
}; 

注意力集中在最後兩個功能;我對他們有兩個問題。 在主程序我想初始化螢火蟲的向量如下:使用參數構造

vector <firefly> fire_vec(10, firefly(5, 5,(float) 1., (float)1.)); 

。我可以這樣做嗎? 第二個問題。 這個矢量應該由排序算法進行排序,

sort(fire_vec.begin(), fire_vec.end()); 

已經超負荷運營商<如下:

bool operator <(const firefly &rhs) const {return time_flash < rhs.time_flash;} 

有什麼錯在這樣做呢? (我認爲有什麼不對,因爲我不能)

+3

「我可以這樣做嗎?」嘗試一下。 「我不能」爲什麼不呢? – 2012-01-07 14:43:02

+1

而且,請每個問題發佈一個問題。這就是爲什麼他們被稱爲問題。 – 2012-01-07 14:43:12

回答

0

我不確定你有什麼問題,但是如果你試圖編譯這段代碼,你會發現

friend bool operator <(const firefly&) const; 

是非法的:在獨立函數上不能有const限定符。另外,operator<是一個二元運算符,所以它應該有兩個參數,兩個類型都是const firefly &

您也可以實施operator<作爲成員函數,就像您自己建議的那樣,但是會刪除friend聲明。

除此之外,你的代碼沒有什麼問題,除了排序完全相同元素的向量是浪費時間。

+0

現在我試圖把重載的運算符的定義<在主,如在全球範圍: 布爾操作符<(常量螢火蟲&RHS,常量螢火蟲&左) { 浮子的a,b; a = rhs.get_time(); b = lhs.get_time(); return a 2012-01-07 15:00:26

+1

@MattF。你*必須*告訴我們編譯器錯誤。你說「它不能編譯」。告訴我們你可以做的一切。您可能會發現將代碼複製到http://ideone.com/並讓它嘗試爲我們編譯代碼會很有用 - 這將允許我們所有人都能看到這些錯誤,並且它可以讓您準確地向我們展示您的內容這樣做。 – 2012-01-07 15:52:06

+0

此ID爲代碼。謝謝。 http://ideone.com/NGfFG – 2012-01-07 16:52:10

0

對不起,但爲什麼你選擇矢量+定製的排序,而不是定製的比較器設置/地圖?

通常,我們使用向量主要是由於要求通過索引隨機訪問其元素。如果情況並非如此,特別是在你的情況下,你需要一個排序的向量,我會建議設置/地圖。

+0

實際上,如果你只需要查找一次,那麼基於'std :: vector '的「地圖」肯定會**更快**。即使有必要進行更改,排序後的「std :: vector 」的性能可能優於「std :: map 」,這取決於與外觀數量相比的更改的大小和數量-UPS。無可否認,我沒有使用排序的'std :: vector '與'std :: unordered_map '進行比較,但是。 – 2012-01-08 04:13:42

-2

對於你將不得不通過重載函數進行排序作爲參數

排序(myvector.begin()+ 4,myvector.end(),myfunction的)第二個問題;

+1

如果他提供operator <,則不是。 – Anteru 2012-01-07 15:58:34