7

がありstd::map<int, std::vector<SomeStruct>>
のようなクエリを提供しますstd::vector<SomeStruct> FindData(int key)

データ全体をコピーしないように、 に変更しますstd::vector<SomeStruct>& FindData(int key)
ただし、特定の のデータがないためkey、何も返さない場合があります。
その場合、空のファイル スコープ変数を宣言してstd::vector<SomeStruct>返します。

しかし、ベクトルへのポインターを選択した場合、つまり、存在しないstd::vector<SomeStruct>* FindData(int key)に戻ることができます。NULLkey

どちらの方がよいですか?質問でポインタへのポインタが悪い(または変ですか?わからない)こと
を学びました( Is there other syntax for this pointer operation?) そして、私は個人的に参照も好きなので、より簡単に使用できますが、欠点は私がしなければならないことですそのための追加の空の変数を宣言します。std::vector
std::vectoroperator[]

コード例は次のとおりです。SomeClass.h

typedef std::vector<SomeStruct> DataVec;
typedef std::map<int, DataVec> DataMap;
DataMap m_DataMap;

現在SomeClass.cpp:

ケース 1:

namespace
{
    DataVec EmptyVector;
}

DataVec& FindDatas(int key)
{
    DataMap::iterator It = m_DataMap.find(key);

    if (It == m_DataMap.end()) return EmptyVec;

    return It->second;
}

ケース 2:

DataVec* FindDatas(int key)
{
    DataMap::iterator It = m_DataMap.find(key);

    if (It == m_DataMap.end()) return NULL;

    return &(It->second);
}

参考:
長所:普通に見えるstd::vector
短所: 追加の変数が宣言されています。

ポインタ:
長所: クエリ関数が短くなり、他の変数は必要ありません。
短所: 奇妙に見えます (?!)、そして を使用することはできませp[i](*p)[i]

どちらの方がよいですか?

4

3 に答える 3

1

出力の参照をパラメーターとして指定することもできるため、列挙子または bool の結果をメソッド出力として追加できます。

    namespace
    {
        DataVec EmptyVector;
    }

    bool FindDatas(int key, DataVec& output)
    {
        DataMap::iterator It = m_DataMap.find(key);

        if (It == m_DataMap.end()) return false;

        output = It->second;
                    return true;
    }
于 2013-03-30T07:47:41.633 に答える
1

設計要件によって異なります。対応する要素を持たないインデックスでこの関数を呼び出すことがプログラミング エラーである場合は、コードを中止する必要があります。ユーザー エラーの場合は、例外をスローする必要があります。それが予想される使用法の一部である場合は、設計に応じて 3 つの選択肢があります。通常、null ポインターを返すか、結果の参照を取る関数からブール値を返すことによって、問題にフラグを立てることができます。新しく作成された有効なオブジェクトを静かに返すことができますstd::set。コンテナーの一部ではないセンチネル オブジェクトを返すことができます。ユーザーは、返された値を使用する前に、それが取得したものかどうかを確認する必要があります。

于 2013-03-30T13:19:28.273 に答える
0

見つからないキーの新しいエントリを作成してもかまわない場合は、次のコードを使用できます。

DataVec& FindDatas(int key)
{
    return m_DataMap[key];
}

見つからないキーの新しいエントリを回避する別のアプローチ:

DataVec& FindDatas(int key)
{
    DataMap::iterator It = m_DataMap.find(key);    
    if (It == m_DataMap.end()) {
        // created on first unfound key and stays
        // alive until the end of the program
        static DataVec fEmpty; 
        return fEmpty; 
    }    
    return It->second;
}
于 2013-03-30T03:34:47.320 に答える