Итераторная печать из векторных ненужных значений - PullRequest
0 голосов
/ 04 сентября 2018

Назначение программы - случайное генерирование чисел в векторный контейнер, затем сортировка их в порядке возрастания и печать чисел. Программа правильно компилируется, но также сортирует и печатает значение 0 для каждого сгенерированного числа.

#include "stdafx.h"  
//contains all header files (ctime, algorithm, iostream, vector), also 
defines const vector size as 250

using namespace std;

void genRndNums(vector <int> &v);
void printVec(vector <int> &v);

int main()
{
    vector <int> myVector(VEC_SIZE);
    genRndNums(myVector);
    printVec(myVector);
    return 0;
}

void genRndNums(vector <int> &v)
{
    int v1;
    srand(time(nullptr));

    for (int i = 0; i < VEC_SIZE; i++)
    {
        v1 = rand() % 1000 + 1;
        v.push_back(v1);

        //v.push_back(rand() % 1000 + 1);
    }
}

void printVec(vector <int> &v)
{
    vector<int>::iterator it;
    sort(v.begin(), v.end());

    for (it = v.begin(); it != v.end(); it++)
    {
        cout << *it << "     ";
    }
}

В случае, если были напечатаны 250 числа, будет отображаться целое число 0 250 раз , а затем отображаться остальные числа в порядке возрастания.

Это связано с тем, что в цикле for в функции print что-то смещено, но я не уверен, как заставить вектор отображать только рандомизированные целые числа.

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Это распространенная ошибка. push_back добавляет в конец вектора, размер которого уже равен VEC_SIZE. Вы можете начать с пустого вектора, например:

vector <int> myVector;

или вы можете присвоить значения существующим векторным (размер которых VEC_SIZE) элементам, например так:

for (int i = 0; i < VEC_SIZE; i++)
{
    v1 = rand() % 1000 + 1;
    v[i] = v1;
}
0 голосов
/ 04 сентября 2018

Ваш векторный конструктор создает вектор с 250 числами (каждое со значением 0). К этим числам вы добавляете еще 250 сгенерированных чисел.

Вы не должны создавать эти 250 чисел в начале

#include <vector>
#include <algorithm>
#include <random>
#include <iostream>

int main()
{
    std::vector<int> v;
    {
        std::random_device r;
        std::default_random_engine e(r());
        std::uniform_int_distribution<int> d(1, 6);
        std::generate_n(std::back_inserter(v), 250, [&](){ return d(r); });
    }

    std::sort(v.begin(), v.end());

    for (auto x : v) {
        std::cout << x << "\n";
    }
    return 0;
}

или переопределить их

#include <vector>
#include <algorithm>
#include <random>
#include <iostream>

int main()
{
    std::vector<int> v(250);
    {
        std::random_device r;
        std::default_random_engine e(r());
        std::uniform_int_distribution<int> d(1, 6);
        std::generate(v.begin(), v.end(), [&](){ return d(r); });
    }

    std::sort(v.begin(), v.end());

    for (auto x : v) {
        std::cout << x << "\n";
    }
    return 0;
}
0 голосов
/ 04 сентября 2018

Поскольку вы используете push_back для добавления элементов в вектор, вам нужно начать с пустого вектора. То есть вам нужно заменить vector <int> myVector(VEC_SIZE); на vector <int> myVector;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...