Ben std::map<int, std::vector<SomeStruct>>
,
ve std::vector<SomeStruct> FindData(int key)
gibi bir sorgu sağlarlar. İşlevi std :: vektörüne bir işaretçi mi, yoksa std :: vektörüne bir başvuru döndürüyor mu?
std::vector<SomeStruct>& FindData(int key)
olmasını değiştirin.
Ancak, bazı
key
için veri olmayacak, bazen dönmek için hiçbir şeyim yok.
Bu durumda, boş bir
std::vector<SomeStruct>
dosya kapsam değişkenini bildirir ve döndürür.
Ancak, işaretçiyi vektöre seçtiğimde, std::vector<SomeStruct>* FindData(int key)
ise key
var olmayan için NULL
döndürebilirim.
Hangisi daha iyi?
Ben operator[]
kolay kullanabilmesi için std::vector
bu işaretçi söz (Is there other syntax for this pointer operation?)
Ve şahsen çok std::vector
atfen gibi kötü (veya garip? Emin) 'dir öğrenilen ama dezavantajı ı beyan etmek zorunda olduğu Bunun için ek bir boş değişken.
Kod örneği gibidir: SomeClass.h
typedef std::vector<SomeStruct> DataVec;
typedef std::map<int, DataVec> DataMap;
DataMap m_DataMap;
Şimdi SomeClass.cpp
yılında:
Durum 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;
}
Durum 2:
DataVec* FindDatas(int key)
{
DataMap::iterator It = m_DataMap.find(key);
if (It == m_DataMap.end()) return NULL;
return &(It->second);
}
bakın ence:
Artılar: normal std::vector
gibi görünüyor.
Eksiler: Ek değişken beyan edildi.
İşaretçi:
Artılar: Daha kısa sorgu işlevi ve başka bir değişkene gerek yoktur.
Eksileri: (?!) garip görünüyor ve siz p[i]
juse olamaz, sen can sıkıcı olduğu (*p)[i]
gerekiyor.
Hangisi daha iyi?
Bir başvuru döndürür; varsayılan bir yapılandırılmış vektör, hafif bir nesnedir, bu yüzden ek 'EmptyVector' etrafına sahip olmak endişe için herhangi bir neden olmamalıdır. Eğer 'nullptr' döndürürseniz, tüm istemci kodları için bir kontrol eklemem gerekecek, ki ben boş bir vektör için kontrol etmekten daha can sıkıcıyım. – Praetorian
@Praetorian: Benzer bir düşüncem var, bu yüzden referans olmayı tercih ediyorum. Ancak istemcinin '(p.empty())' dönüşünü de kontrol etmesi gerekiyor, yani belki de null-check like ifadeleri hala var :( –