0

どのように書くことができますか:

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

などをより効率的に。私は1000以上のボタンを持っています。これを書くためのより良い方法があることを願っていました。

以下を試してみたところ、XCode で & を挿入せざるを得ませんでした。このコードは私のプログラムをクラッシュさせました:

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

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

ありがとう

4

5 に答える 5

1

新しいC++を使用している場合は、emplace_backについて覚えておいて、可能であれば移動してください。ボタンはポインターだと思いますか?あなたが「&」だから。ポインタとオブジェクト全体のコピーは2つの異なるものです。ボタンの定義を追加する必要があります。.reserveを使用して、不要なオブジェクトのコピーを回避します(std :: containersはデフォルトでオブジェクトのコピーを作成します)。

また、ブーストの例ではptr_vectorがあることを覚えておいてください。これは、明確な状態を保つのに役立ちます。

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

于 2012-08-29T19:17:35.930 に答える
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

全体として、この質問は答えにくいものです。パフォーマンスの質問のように表現されていますが、最初に対処する必要がある意味論的な問題が他にもあり、多くの詳細が欠落しています。

于 2012-08-29T19:14:32.077 に答える
0

imageButton1 を imageButton1000 に追加する場合は、文字列接続マクロを使用することをお勧めします

#define imagebutton(X) imageButton##X

ループからこの関数を呼び出すことができます。配列としてimagebuttonsがある場合は、memcpyも実行できます

memcpy(button, imagebutton, noOfButtons)
于 2012-08-29T19:30:37.167 に答える
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();
}

コンテナーに固定サイズを使用する予定がある場合は、Memory Poolを作成することもできます。これにより、ヒープの断片化や厄介なクラッシュを回避できます。

とにかく、「 new 」を大量に使用する代わりに、メモリ プールを使用することを強くお勧めします。1 つの新規は 1000 よりも優れています。2000 %高速になることさえあります。

于 2012-08-29T19:14:48.390 に答える
0

imageButton1throughという名前の 1000 個のローカル変数を宣言しているように聞こえますが、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");

配列を埋めるのに 1000 行を費やさなければなりませんが、完全に一意のオブジェクトが 1000 個ある場合、これは避けられません。しかし、少なくともこの方法は 2,000 行の長さではありませ

于 2012-08-29T19:31:08.693 に答える