我该怎么写:
buttons[0] = imageButton;
buttons[1] = imageButton1;
等更有效。我有超过 1000 个按钮。我希望有更好的方法来写这个。
我尝试了以下操作,并被 XCode 强制插入 &。此代码使我的程序崩溃:
for (int i = 0; i < numberOfButtons; i++)
{
buttons[i] = &imageButton[i];
}
谢谢
我该怎么写:
buttons[0] = imageButton;
buttons[1] = imageButton1;
等更有效。我有超过 1000 个按钮。我希望有更好的方法来写这个。
我尝试了以下操作,并被 XCode 强制插入 &。此代码使我的程序崩溃:
for (int i = 0; i < numberOfButtons; i++)
{
buttons[i] = &imageButton[i];
}
谢谢
如果你有一个指针向量并且想快速填充它,你可以使用这个:
std::vector<t_button*> buttons(1000, 0); // << is that what you wanted?
for (int i = 0; i < numberOfButtons; i++) {
buttons[i] = &imageButton[i];
}
当然,您需要确保添加到向量中的内容比向量本身的寿命更长,因为这是一个指向按钮的指针数组,而不是值。
如果您只有大量具有唯一地址和唯一名称且后缀单调递增的自由变量,那么如果您将这些值本身存储在向量中,从长远来看,您可能会更快乐:
std::vector<t_button> buttons(1000, 0); // << holds 1000 buttons by value
总的来说,这个问题很难回答——它的措辞就像一个性能问题,但还有其他语义问题需要首先解决,并且缺少很多细节。
如果您使用的是新的 C++,请记住 emplace_back 并尽可能移动。我猜按钮是一个指针?因为你 ”&”。复制指针和整个对象是两个不同的东西。您应该添加按钮的定义。使用 .reserve 避免不必要的复制对象( std::containers 默认复制对象)。
还要记住,在 boost 中的示例 ptr_vector 将帮助您保持清晰。
http://www.boost.org/doc/libs/1_51_0/libs/ptr_container/doc/ptr_vector.html
如果要将 imageButton1 添加到 imageButton1000,我建议使用字符串连接宏
#define imagebutton(X) imageButton##X
并且可以从您的循环中调用此函数。如果你有 imagebuttons 作为数组,你也可以做 memcpy
memcpy(button, imagebutton, noOfButtons)
听起来您正在声明一千个名为imageButton1
through的局部变量imageButton1000
,现在您想将它们放入一个数组中。
Button imageButton1("Save");
Button imageButton2("Load");
//...etc...
Button imageButton1000("Reticulate Splines");
//now that we've exhaustively created all the buttons, exhaustively put them into the array
buttons[1] = &imageButton1;
buttons[2] = &imageButton2;
//...etc...
buttons[1000] = &imageButton1000;
根据我的经验,在变量名中放一个数字是一个非常强烈的信号,表明数据不应该单独声明,而应该是类似对象集合的一部分。
buttons[0] = new Button("Save");
buttons[1] = new Button("Load");
//...etc...
buttons[999] = new Button("Reticulate Splines");
您仍然需要花费一千行来填充数组,但是如果您有一千个完全独特的对象,这是不可避免的。但至少这种方式不是两千行长。
您可以使用矢量来保存按钮的地址
std::vector< ImageButton* > Buttons;
Buttons.push_back( &MyButton );
/* then */
ImageButton* button = Buttons.at(i); // int i, is the index
button->DoSomething();
例如你可以
std::vector< ImageButton* > Buttons;
for(int i=0;i<100;i++)
{
ImageButton* button = new ImageButton;
Buttons.push_back( button );
}
for(int i=0;i<100;i++)
{
ImageButton* button = Buttons.at(i);
button->DoSomething();
}
如果您打算为容器使用固定大小,您不妨创建一个Memory Pool。这将使您免于堆碎片和令人讨厌的崩溃。
无论如何,我强烈建议使用内存池作为使用“新”的替代方案。1 个新的比 1000 个要好。它甚至可以快2000% 。