簡體   English   中英

如何在C ++中返回空迭代器?

[英]how to return a null iterator in c++?

我正在編寫一個包裝類,如下所示:

class Wrapper{
private:
    std::list<People> men;
    std::list<People> woman;

    /**
        some bizzar logics
    **/
public:
    std::list<People>::iterator getMeTheNextOne(){};
}

問題是,有時我需要返回一個空(或NULL)的迭代器,說在這兩個列表中不再有“合適的”人員。 如果我只返回men.end()或women.end(),用戶會抓到這個嗎?

為用戶成像有以下代碼:

Wrapper wo;
std::list<People>::iterator it = wo.getMeTheNextPeople();
if(it == /*what should I put here? i cannot access the list members of the Wrapper*/){
// do something here
}

當用戶無權訪問迭代器來自的列表時,返回列表迭代器很奇怪而且很丑陋。 為什么不返回指向People的指針,該指針可以為NULL?

返回可以來自不同列表的迭代器沒有意義。 無法檢查迭代器是否有效。 最好的方法是返回一個指向要存儲的實際對象的指針,該指針可以為null。

另一方面,如果您堅持要返回迭代器,該怎么辦就是在Wrapper有一個方法來檢查迭代器的有效性。

class Wrapper{
private:
    std::list<People> men;
    std::list<People> woman;

    /**
        some bizzar logics
    **/
public:
    std::list<People>::iterator getMeTheNextOne(){};

    bool isValid(std::list<People>::iterator const & it) const 
    {
       return it != men.end() || it != women.end();
    }
};

您可以這樣使用:

Wrapper wo;
std::list<People>::iterator it = wo.getMeTheNextPeople();
if(wo.isValid(it))
{
   // do something here
}

迭代器永遠不能為null。 如果迭代器沒有指向任何東西,則其值為end()。 我認為您可以返回end()。 通常,用戶使用迭代器來迭代某些內容,並且當他們進行迭代時,他們有責任檢查自己是否已經到達終點,並且唯一的檢查方法是將迭代器的值與end()進行比較。

返回標准“超出范圍迭代器”: wo.end();

通常,解決方案是為容器的開始和結束迭代器提供訪問器,因此添加一個

class Wrapper {
public:
    std::list<People>::iterator end();
};

將允許您編寫以下內容:

Wrapper wo;
std::list<People>::iterator it = wo.getMeTheNextPeople();
if(it == wo.end()){
// do something here
}

但是,在這種情況下,如果您有兩個單獨的列表,則可能需要添加一個endOfMen和一個endOfWomen,或者將它們組合到一個列表中,具體取決於哪種方法可以最好地解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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