簡體   English   中英

創建新對象時使用C ++:迭代器不可遞增

[英]c++ when creating new object: iterator not incrementable

我正在處理一個任務,以創建一群兔子,它們可以在每個回合中繁殖。 因此,我定義了一個Bunny類(單獨),然后定義了一個帶向量指向不同兔子的Troop類。 我的問題是,每次使用new在循環中創建對象Bunny時,都會出現錯誤消息:

“調試斷言失敗!! ...矢量迭代器不可遞增...”

這是我的代碼示例:

class Bunny {
private:
    string sex;
    string color;
    string name;
    int age;
public:
    string getname() { return name;};
    Bunny(); // constructor
};

class Troop {
private:
    vector<Bunny *> bunpointer;
    vector<Bunny *>::iterator it;
public:
    void newbunny();
    void multiply();
};

void Troop::newbunny() {
    Bunny * bun;  // pointer to the Bunny class
    bun = new Bunny;
    cout << "Bunny " << bun->getname() << " is born! \n";
    bunpointer.push_back(bun);
}

void Troop::multiply() {
    it = bunpointer.begin();
    while(it!=bunpointer.end()) {
        cout << (*it)->getname() << " gave a birth. ";
        newbunny();
        ++it;
    }
    it = bunpointer.begin();
}

因此,如果我在開始時創建了5個兔子,並調用了Troop::multiply函數,則應該有10個兔子。 一個有趣的觀察是,該錯誤將在2個兔子出生后發生。

我認為問題可能在於在迭代器循環中使用new創建新對象。 new函數可能會以某種方式中斷迭代器指針*it 但是我不確定是否是這種情況,如果確實如此,如何處理。

修改:所以實際上是使用push_back()的問題,這可能會使iterator無效!

先感謝您!!

看來您正在嘗試遍歷std::vector時對其進行修改。 由於多種原因,這通常不是一個好主意。

特別是,當您在迭代器的循環內調用newbunny() ,用於保留的迭代器可能會失效,因為矢量可能會在push_back期間調整大小。

有關詳細信息,請參見此問題

正如其他人提到的, push_back()是您的罪魁禍首,而不是new

一種緩解疾病的方法是:

size_t const max(bunpointer.size());
for(size_t i(0); i < max; ++i)
{
    cout << bunpointer[i]->getname() << " gave a birth. ";
    newbunny();
}

之所以可行,是因為您只在現有向量的末尾添加了新的兔子。 這些新兔子不會被循環考慮(最大值不會更改,因為您調用newbunny()...),並且[i]訪問使用了向量的當前狀態。

如果您要刪除項目,則該循環將不起作用...

附帶說明一下:“ bunpointer”這個名稱不是很清楚……它不是指針,它是指針的向量。

1)除非您有理由,否則您的代碼根本不需要使用new 代碼變得更容易,並且沒有內存泄漏的機會。 另外,除非您能說明理由,否則我認為Troop類中不需要迭代器成員。

2)至於您眼前的問題,只需使用非迭代器依賴循環即可。 換句話說,是一個簡單的循環,從0到當前的兔子數量減去1。

這是一個例子:

#include <vector>
//...
class Troop {
   private:
       std::vector<Bunny> bunpointer;
   public:
       void newbunny();
       void multiply();
};

void Troop::newbunny() {
   bunpointer.push_back(Bunny());
}

void Troop::multiply() {
    size_t siz = bunpoiner.size(); 
    for (size_t i = 0; i < siz; ++i ) {  
       newbunny();
       cout << (*it)->getname() << " gave a birth. ";
    }
}

newbunny()函數僅使用默認構造函數創建一個Bunny()並將該項添加到向量中。

如果要使用在插入項目時不會使迭代器無效的容器,則可以使用std::list而不是std::vector

暫無
暫無

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

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