在C ++中将项添加到数组的最有效方法

时间:2012-08-29 19:12:45

标签: c++ arrays performance

我怎么写:

    buttons[0] = imageButton;
    buttons[1] = imageButton1;

等更有效率。我有超过1000个按钮。我希望有更好的方法来写这个。

我尝试了以下内容并被迫插入&通过XCode。这段代码破坏了我的程序:

    for (int i = 0; i < numberOfButtons; i++)
    {

        buttons[i] = &imageButton[i];
    }

由于

5 个答案:

答案 0 :(得分:1)

如果你有一个指针向量并希望快速填充它,你可以使用它:

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
总的来说,问题很难回答 - 它的措辞就像一个性能问题,但还有其他语义问题需要首先解决,并且缺少很多细节。

答案 1 :(得分:1)

如果您正在使用新的C ++,请记住emplace_back并尽可能移动。我猜按钮是指针?因为你“&amp;”。复制指针和整个对象是两回事。您应该添加按钮的定义。使用.reserve可以避免不必要的复制对象(默认情况下std :: containers会创建对象的副本)。

还要记住在boost中的示例ptr_vector,它将帮助您保持清醒。

http://www.boost.org/doc/libs/1_51_0/libs/ptr_container/doc/ptr_vector.html

答案 2 :(得分:0)

您可以使用向量来保存按钮的地址

    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();
}

如果您计划为容器使用固定大小,则可以创建内存池。这将使您免于堆碎片和令人讨厌的崩溃。

无论如何我强烈建议使用内存池作为使用' new '的替代方法。 1 优于1000.甚至可以 2000%更快。

答案 3 :(得分:0)

如果你想将imageButton1添加到imageButton1000,我建议使用字符串连接宏

#define imagebutton(X) imageButton##X

并且可以从循环中调用此函数。 如果你有图像按钮作为数组,你也可以做memcpy

memcpy(button, imagebutton, noOfButtons)

答案 4 :(得分:0)

听起来你要声明一千个名为imageButton1imageButton1000的局部变量,现在你想把它们放在一个数组中。

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");

你仍然需要花费一千行来填充数组,但如果你有一千个完全独特的对象,这是不可避免的。但至少这种方式不是两个千行。