私はstd::map<int, std::vector<SomeStruct>>
,
を持っており、std::vector<SomeStruct> FindData(int key)
のようなクエリを提供しています。私の関数はstd :: vectorへのポインタ、またはstd :: vectorへの参照を返しますか?
データ全体のコピーを防止するため、std::vector<SomeStruct>& FindData(int key)
に変更しました。
しかし、特定のデータはありませんkey
、時々私は返すものがありません。
この場合、空のstd::vector<SomeStruct>
というファイルスコープ変数を宣言して返します。
しかし、ベクトルへのポインタを選択した場合、それはstd::vector<SomeStruct>* FindData(int key)
です。それで、存在しないkey
に対してはNULL
を返すことができます。
どちらが優れていますか?
私は
(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);
}
参照してください。 ence:
長所:通常のように見えますstd::vector
。
短所:追加変数が宣言されました。
ポインタ:
長所:クエリ関数が短く、他の変数は不要です。
短所:奇妙に見える(?!)、あなたはp[i]
を怒らせることはできません。(*p)[i]
には迷惑です。
どちらが優れていますか?
リファレンスを返します。デフォルトの構築されたベクターは軽量のオブジェクトなので、追加の 'EmptyVector'を周りに置いても心配はありません。 'nullptr'を返すと、すべてのクライアントコードはそのチェックを含める必要があります。私は個人的に空のベクトルをチェックするよりも面倒です。 – Praetorian
@Praetorian:私は同様の考えを持っていたので、私は参照を好む理由です。しかし、クライアントは 'if(p.empty())return'もチェックしなければならないので、ヌルチェックのような文がまだ存在するかもしれません:( –