1

for ループを使用せずに、一度にクラスのすべてのオブジェクトに対して関数を実行することは可能ですか? たとえば、次のコードでは:

    #include <iostream>

    using namespace std;

    class CTest {
            public:

            int X;

            void clear() {
                X = 0;
            }

    };

    int main() {
        CTest A[100];

        for (int i = 0; i < 100; ++i) {
            A[i].X = 10;
        }

        for (int i = 0; i < 100; ++i) {
            A[i].clear();
        }

        return 0;
    }

一度にすべてのオブジェクトを初期化するようなA.X = 10ことや、たとえばA.clear()すべてのオブジェクトを一度にクリアするために使用することは可能ですか? <vector>この目的で使用することは可能だと思いますが、他に方法はありますか?

4

2 に答える 2

2

できません。ある操作を N 回実行する必要がありますか? まあ、せいぜい、それは線形時間操作です。あなたはそれから一定の時間を得るつもりはありません。それ以外を期待しても意味がありません。

于 2013-04-16T06:27:51.420 に答える
2

配列を持つ STL アルゴリズム ヘッダーから std::for_each を使用できます。イテレータ begin()/end() の代わりに、CTest* ポインタ 'array' および 'array + size' またはより良い std::begin(A)/std::end(A) を渡すことができます。唯一の問題は、clear() などの非静的メンバーを呼び出すことです。C++11 を使用している場合は、ラムダを使用するか、STL 関数またはブースト バインドを確認してください。

//C++11 code:
#include <algorithm>
std::for_each(std::begin(A),std::end(A),[](CTest& ct){ct.X = 10;});
std::for_each(std::begin(A),std::end(A),[](CTest& ct){ct.clear();});

編集済み: ポインター演算の代わりに配列に begin/end を使用

于 2013-04-16T06:40:17.747 に答える