があり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)
に戻ることができます。NULL
key
どちらの方がよいですか?質問でポインタへのポインタが悪い(または変ですか?わからない)こと
を学びました( Is there other syntax for this pointer operation?)
そして、私は個人的に参照も好きなので、より簡単に使用できますが、欠点は私がしなければならないことですそのための追加の空の変数を宣言します。std::vector
std::vector
operator[]
コード例は次のとおりです。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]
。
どちらの方がよいですか?