ошибка итераторов вектора несовместимая - PullRequest
2 голосов
/ 23 апреля 2011

Я получаю ошибку несовместимых векторов итераторов во время выполнения. строка, в которой это происходит, находится в самом конце раздела кода внутри цикла for (humans.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(); }

(Человек - производный класс игрока)

, поскольку iter является итератором для вектора строк, я не понимаю, почему я получаю векторные итераторы несовместимыми в этой строке внутри цикла for. Я не пытаюсь использовать его непосредственно с людьми.

ошибка здесь:

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

Ответы [ 4 ]

3 голосов
/ 23 апреля 2011

Ошибка в коде, который вы не показываете. Следующий код, который я написал на основе вашего кода и ваших описаний, не выдает никаких ошибок:

#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;
}
1 голос
/ 23 апреля 2011

Вместо этого попробуйте

iter != names.end()
0 голосов
/ 23 апреля 2011

В реализации заголовка Microsoft <vector> в вашей сборке включены некоторые проверки отладки, которые делают итераторы намного более богатыми объектами, чем простые указатели - они отслеживают контейнер, через который они перебираются, и их итераторы "соседей", а также объектони указывают на.Утверждение, с которым вы сталкиваетесь, проверяет 2 итератора, которые должны указывать на один и тот же контейнер, но обнаруживает, что они этого не делают (в соответствии с состоянием итераторов).

Таким образом, вы либо повреждаете где-нибудь объекты / списки итераторов, либо делаете что-то, что не показано в ваших фрагментах кода.

0 голосов
/ 23 апреля 2011

Всегда предварительно увеличивайте итераторы в цикле for и используйте it != end в качестве сторожа в C ++ (это также относится к int s.

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