2013-05-20 82 views
1

我有一個map<int, Button*>其中按鈕類有幾個屬性,特別是一個名爲位置的整數變量。交換地圖的兩個元素

如果我想在Button類中交換兩個位置,我必須改變這個鍵,始終是key = Button-> position,它必須是一個映射。

我認爲(使用擦除)並重新插入刪除的地圖的兩個位置中的(指示索引):

實施例(indexFirst和indexSecond是已知的):

map<int, Button*> buttons; 

int posOfFirst = buttons.find(indexFirst)->second->getPos(); 
int posOfSecond = buttons.find(indexSecond)->second->getPos(); 

Button* button1 = buttons.find(indexFirst)->second; 
Button* button2 = buttons.find(indexSecond)->second; 

buttons.erase(indexFirst); 
buttons.erase(indexFirst); 

buttons[posOfSecond] = button2; 
buttons[posOfFirst] = button1; 

但似乎沒有改變對象。爲什麼?

+0

但你甚至在哪裏做交換?看着你的代碼,我沒有看到。 Button1位於indexFirst或posOfFirst的位置,而button2位於indexSecond或posOfSecond的位置,這在代碼中沒有改變。 – Amadeus

回答

0

您正在擦除相同的元素(在indexFirst處)兩次(查看您的代碼)。此外,它看來,你是在相同的位置插入元素作爲其最初:

buttons[posOfSecond] = button2; 
buttons[posOfFirst] = button1; 

我的事情應該改爲:

buttons[pos1] = button2; 
buttons[pos2] = button1; 

我還建議更好的策略。除了使用刪除和插入操作外,還可以在Button類中創建一個增變器方法,該方法允許您設置position屬性的值。然後,您只需獲取這兩個按鈕的位置(如使用訪問器方法在代碼的第一部分中所做的那樣),然後將第一個位置分配給第二個按鈕,將第二個位置分配給第一個按鈕。你應該有這樣的事情在您的按鈕標題:

void setPos(int pos); 

所以這裏有一個例子:

map<int, Button*> buttons; 

//Find the buttons only once and save their references 
//if you need further information that 
//their storing, instead of constantly searching 
//through the map. This is more efficient 
Button* button1 = buttons.find(indexFirst)->second; 
Button* button2 = buttons.find(indexSecond)->second; 

int pos1 = button1->getPos(); 
int pos2 = button2->getPos(); 

button1->setPos(pos2); 
button2->setPos(pos1); 

buttons[pos2] = button1; 
buttons[pos1] = button2; 

和你做。

如果按鈕存儲的唯一唯一數據是它們的位置,這將是真實的,否則您必須交換其他信息。

這裏有很多策略,有不同的交易方式,但要確保你不僅要考慮它是否工作,而且要考慮它是否有效。

+0

如果'getPos()'返回的值與用於將其存儲在映射中的鍵值不同,那麼這將不起作用。 –

+0

這是你編輯之前;) –

+0

@CaptainObvlious是的,我看到了代碼的問題,但你沒有正確指定它,我會清理這個答案的評論,所以沒有混亂。 – lekroif