Vector迭代器不兼容错误

vector iterators incompatible error

本文关键字:错误 不兼容 迭代器 Vector      更新时间:2023-10-16

我在运行时得到向量迭代器不兼容的错误。发生这种情况的那一行位于代码段的最后,在for循环(human。push_back(Human(&deck, (*iter)));)当我第一次得到错误时,我错误地使用了不同的迭代器而不是'iter',所以运行时错误完全有意义。但是现在我改变了它并重新编译了所有内容(我仔细检查了一下),我仍然得到这个错误。

void BlackjackGame::getHumansAndHouse()
{
    // asks how many players, pushes_back vector accordingly, initializes house, checking for valid input throughout
    string input;
    vector<string> names;
    while(true)
    {
        cout << "How many humans? (1 - 7)" << endl;
        cin >> input;
        if(!isdigit(input[0]))
            cout << "Invalid input. ";
        else
        {
            input.erase(1);
            int j = atoi(input.c_str());
            for(int i = 1; i <= j; i++)
            {
                while(true)
                {
                    cout << "Enter player " << i << " name: ";
                    cin >> input;
                    if(strcmp(input.c_str(), "House") == 0)
                        cout << "Player name has to be different than 'House'." << endl;
                    else
                    {
                        names.push_back(input);
                        break;
                    }
                }
            }
            break;
        }
    }
    vector<string>::iterator iter;
    for(iter = names.begin(); iter != names.end(); iter++)
        humans.push_back( Human(&deck, (*iter)) );
    house = House(&deck);
}

人类是一个载体:

vector<Human> humans;

其中Human是一个类,其构造函数如下:

Human(Deck *d, string n) : Player(d), name(n) { printNameCardsAndTotal(); }

(Human是Player的派生类)

因为iter是指向string类型的vector的迭代器,所以我不明白为什么在for循环的那一行中会出现vector迭代器不兼容的情况。我又不是想把iter直接用在人类身上。

error is here

humans.push_back( Human(&deck, (*iter)) );

错误在您没有显示的代码中。下面的代码,我是根据你的代码和你的描述编写的,没有产生任何错误:

#include <vector>
#include <string>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cctype>
using namespace std;
class Deck
{
};
class Player()
{
  public:
    Player(Deck *d) {}
};
class Human : public Player
{
  public:
    Human(Deck *d, string n) : Player(d), name(n) {}
  private:
    string name;
};
class House
{
  public:
    House(Deck *d) {}
};
int main()
{
    Deck deck;
    vector<Human> humans;
    string input;
    vector<string> names;
    while(true)
    {
        cout << "How many humans? (1 - 7)" << endl;
        cin >> input;
        if(!isdigit(input[0]))
            cout << "Invalid input. ";
        else
        {
            input.erase(1);
            int j = atoi(input.c_str());
            for(int i = 1; i <= j; i++)
            {
                while(true)
                {
                    cout << "Enter player " << i << " name: ";
                    cin >> input;
                    if(strcmp(input.c_str(), "House") == 0)
                        cout << "Player name has to be different than 'House'." << endl;
                    else
                    {
                        names.push_back(input);
                        break;
                    }
                }
            }
            break;
        }
    }
    vector<string>::iterator iter;
    for(iter = names.begin(); iter != names.end(); iter++)
        humans.push_back( Human(&deck, (*iter)) );
    House house = House(&deck);
    return 0;
}

不如试试

iter != names.end()

在for循环中始终使用预增量迭代器,并使用it != end作为c++中的哨兵(这也适用于int s)。

for(iter = names.begin(); iter **!=** names.end(); **++iter**)

微软<vector>头实现在你的构建中启用了一些调试检查,使迭代器比指针更丰富——它们跟踪它们正在迭代的容器、它们的"邻居"迭代器以及它们指向的对象。你遇到的断言是检查两个迭代器应该指向同一个容器,但它发现它们没有(根据迭代器的状态)。

所以你要么在某处破坏了迭代器对象/列表,要么你做了一些代码片段中没有显示的事情。