«Итератор не разыменованный»

0

Мне нравится, когда код дает мне головные боли. Кроме этого. Я просто заполняю вектор случайными удвоениями, используя часто используемый алгоритм. Проблема заключается в том, что после компиляции она дает мне ошибку "Итератор не вызывающей ошибки". Вот мой кодовый путь:

-First Я создаю экземпляр класса.

 Random rm;

-Which запускает этот конструктор

    Random::Random() // Constructor
{
    this->cAR();
    this->min = 0; // Default: Sets minimum to zero
    this->max = RAND_MAX; // Default: Sets maximum to RAND_MAX

    fillVect(); // Fills vector
    this->numCount = num.begin();
}

-cAR просто устанавливает некоторые значения в нижней функции

void Random::cAR()
{
    this->num.clear();
    this->num.reserve(250);
    this->place = 0;
}

-Now для основной проблемы (я думаю), я повторяю вектор и заполняю его случайными числами

void Random::fillVect()
{
    srand(time(NULL));
    vector<double>::iterator counter;
    for (counter = this->num.begin(); counter <= num.end(); counter++)
    {
        *counter = (((double) rand() / (double) RAND_MAX) * (this->max - this->min)) + this->min;
    }

    shuffle();
}

-That должен заполнить вектор (который является "двойным" вектором типа, btw) со случайными числами. Затем я вызываю следующее число в векторе (который должен быть 0-м индексом в начале) с этим утверждением

double r = rm.nextDbl();

-Which определяется в этой функции

double Random::nextDbl()
{
    double temp = *numCount;
    return temp;
    numCount++;
    place++;
}

В моей голове это правильный путь кода. Теперь я только кодировал 2 года и только 1 год в качестве студента в реальном колледже, поэтому мой вопрос был бы, почему он дает мне эту ошибку времени выполнения? Я ценю любую помощь заранее.

Теги:
iterator
runtime-error
dereference
runtime

2 ответа

1

У вас две проблемы в коде. Во-первых: вы разыскиваете итератор end() в своем цикле

for (counter = this->num.begin(); counter <= num.end(); counter++)
//                                        ^^ should be less than

Во-вторых: ваш num вектор пуст, поэтому, как только вы исправите первую проблему, вы просто не получите числа:

this->num.clear();       // num is now empty
this->num.reserve(250);  // num is still empty

Я думаю, вы хотели называть resize(250) вместо reserve(250). Последний просто гарантирует, что вектор имеет достаточную емкость... если он уже был пуст, он останется пустым.

Кроме того, два предложения:

  1. Рассмотрите возможность использования std :: generate в качестве замены для вашего цикла. То, что вы делаете, точно генерирует значения для num, поэтому этот алгоритм сделает его явным для ваших читателей.
  2. Ваш подход к выбору случайного числа неравномерен:

    (((double) rand()/(double) RAND_MAX) * (this->max - this->min)) + this->min;

Это не приведет к равномерному распределению, даже если rand() сам создаст равномерное распределение... и это почти никогда не даст вам this->max как значение. Гораздо лучшее решение было бы:

int nextRandom() {
    int range = this->max - this->min + 1;
    int max_rand = RAND_MAX / range * range; // largest multiple of range under RAND_MAX
    for (;;) {
        int r = rand();
        if (r < max_rand) {
            return (r % range) + this->min;
        }
    }
}
  • 0
    Где было бы идеальным местом для изменения размера вектора? Должно ли оно быть в конструкторе или в самом fillVect ()?
  • 0
    @ user3338383 Я бы положил его в fillVect() . Это самое разумное место.
1

Вы разыскиваете итератор end(), который недействителен:

 for (counter = this->num.begin(); counter <= num.end(); counter++)

Это должно быть:

for (counter = this->num.begin(); counter != num.end(); ++counter)
  • 0
    Но почему счетчик ++? Разве я не должен назначать случайное число первому индексу, а затем увеличивать место индекса? Почему счетчик должен быть увеличен заранее?
  • 0
    Предпочитаю преинкремент, а не постинкремент. Вероятно, на SO и в вашей любимой книге по C ++ есть множество тем, объясняющих, почему это так.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню