0

別のオブジェクトへの参照のリストを含む別のタイプのオブジェクトへの参照のリストを含むオブジェクトによって作成されるツリーのようなシステムを持っています...など。

したがって、すべて異なるタイプのオブジェクトのツリーが得られます。

今、私が今していることは、「for each」ループを使用して、必要なオブジェクトに到達するまで、親の下にある各要素を取得することです。(これらのオブジェクトには、私もアクセスする必要がある文字列が含まれています。この文字列が探しているものと一致する場合は、フラグを設定します。複数の一致がある可能性がありますが、確認する必要があるのは 1 つだけです。)

これは、そのフラグを設定するとどうなるかについて別のポイントを提起します。これ以上続行する必要がないためです。これは、一致が 1 つの文字列で見つかった場合、プログラムの残りの部分を続行できると想定できるためです。したがって、これにより、ツリーの残りの反復が無意味になります。

私は C++ MFC で作業しているため、問題があれば CString を探しています。

「子」オブジェクトを保持するコンテナーのレイヤーは、親オブジェクトのベクターとして始まり、その後に子オブジェクトのリストが続き、その後に子オブジェクトのリストが続きます。

ツリーのブランチを次のようにします。

Initial Vector: { 1object1, 1object2, 1object3, ..., 1objectN }

object1 List: { 2object1, 2object2, 2object3, ...,2objectN }

2object1 List: { 3object1, ... 3objectN }

if (3object1.name() == "match")
{
    flag = TRUE;
    break?
}

質問を一般的なものにするために、ベクトルとリストを使用しているにもかかわらず、使用される実装についてあまりうるさくはありません。

私の実際のコードは次のようになります。

bool flag = FALSE;
    for each (1Object 1object in m_1Objects)
        for each (2Object 2object in 1object.Get2Objects())
            for each (3Object 3object in 2object.Get3Objects())
                if (3object.GetName() == "match") flag = TRUE;

おわかりのように、システムが大きくなりすぎると、これを実行するのに永遠にかかる可能性があります。特に、フラグが設定されたら、それから抜け出す方法がわからないためです。

これを行うためのより効率的でクリーンな方法は何でしょうか?

4

2 に答える 2

1

さて、それを処理するにはいくつかの方法があります。

最も簡単で「最もハックな」方法は、アイテムが見つかったら例外をスローし、ループの外でキャッチすることです。きれいではありませんが、うまくいきます。そして、あなたはまだ使うことができますstd::for_each。説明するために(このソリューションを承認するわけではありません):

bool flag = FALSE;                                                                                                                                                  
try {
    for each (1Object 1object in m_1Objects)
        for each (2Object 2object in 1object.Get2Objects())
            for each (3Object 3object in 2object.Get3Objects())
                if (3object.GetName() == "match") throw true;
} catch (bool e) {
    flag = TRUE;
}

もう 1 つの方法は、std::find_ifの代わりにを使用std::for_eachし、各レベルで によって返されたイテレータfind_ifが最後かどうかをチェックすることです。(最後はアイテムが見つからないことを示します)。

しかし、私が考える最も簡単な方法は、 foreach 反復を単純な for ループとして実装し、フラグを含む条件ステートメントを使用することです。たとえば、このコード

bool flag = 0;
for (int i = 0; i < 10 && !flag; ++i) {
    std::cout << i << std::endl;
    if (5 == i)
        flag = true;
}

出力します

0
1
2
3
4
5

それはあなたの質問に役立ちますか?

于 2013-06-19T21:00:53.290 に答える
0

このネストされた検索ループを、true/false を返す const メソッドに分離します。次に、アイテムが見つかったら、単に「true を返す」だけです。

于 2013-06-19T20:54:30.423 に答える