[英]Should my function return a pointer to std::vector, or a reference to std::vector?
我有一個std::map<int, std::vector<SomeStruct>>
,
並提供類似std::vector<SomeStruct> FindData(int key)
。
為了防止復制整個數據,我將其修改為std::vector<SomeStruct>& FindData(int key)
。
但是,某些key
沒有數據,所以有時我沒有任何回報。
在這種情況下,我聲明一個文件范圍變量,它是一個空的std::vector<SomeStruct>
並返回它。
但是如果我選擇指向vector的指針,那就是std::vector<SomeStruct>* FindData(int key)
那么我只能為不存在的key
返回NULL
。
哪一個更好?
我在問題中了解到指向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
。
缺點:聲明了附加變量。
指針:
優點:查詢功能更短,無需其他變量。
缺點:看起來很奇怪(?!),你不能j p[i]
,你必須(*p)[i]
,這很煩人。
哪一個更好?
您還可以將輸出的引用作為參數,以便您可以添加一些枚舉器或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;
}
這取決於您的設計要求。 如果使用沒有相應元素的索引調用此函數是編程錯誤,則代碼應該中止。 如果是用戶錯誤,則應拋出異常。 如果它是預期用途的一部分,那么您有三種選擇,同樣取決於您的設計。 您可以標記問題,通常是通過返回空指針或從獲取結果引用的函數返回布爾值。 你可以像std::set
那樣靜靜地返回一個新創建的有效對象。 您可以返回不屬於容器的sentinel對象,用戶必須檢查這是否是他們在使用返回值之前獲得的內容。
如果您不介意為未完成的密鑰創建新條目,那么您可以使用以下代碼:
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.