簡體   English   中英

我的函數應該返回一個指向std :: vector的指針,還是對std :: vector的引用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM