1

我有一个map<int, Button*>其中的按钮类有几个属性,特别是一个名为位置的整数变量。

如果我想在 Button 类中交换两个位置,我必须更改键,始终为键 = Button-> 位置,并且它必须是地图。

我想到了删除地图的两个位置(使用擦除)并重新插入(指示索引):

示例(已知 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;

但似乎没有改变对象。为什么?

4

1 回答 1

0

您正在擦除相同的元素(在 indexFirst 处)两次(查看您的代码)。此外,您似乎将元素插入到与它们最初相同的位置:

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

我的事情应该改为:

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

我也会推荐一个更好的策略。与其在移除和插入之间进行杂耍,不如在 Button 类中创建一个 mutator 方法,它允许您设置 position 属性的值。然后,您只需获取两个按钮的位置(就像您在代码的第一部分中使用访问器方法所做的那样),然后将第一个位置分配给第二个按钮,将第二个位置分配给第一个按钮。您的 Button 标题中应该有类似的内容:

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;

你完成了。

如果按钮存储的唯一唯一数据是它们的位置,这将是正确的,否则您也必须交换其他信息。

这里有很多策略,有不同的交易,但要确保你始终考虑它是否有效,但它是否有效。

于 2013-05-20T00:46:13.583 回答