c ++ pu sh назад массив в векторе - PullRequest
0 голосов
/ 06 марта 2020

У меня есть массив из 9 чисел, и мои функции в моем классе чисел используются для переупорядочивания 9 чисел в массиве без дублирования чисел, а затем для отображения количества раз, которое была вызвана функция rand (). Теперь мне нужно сгенерировать десять списков чисел и сохранить их в векторе. вот код:

class numbers{
    private:
        int indexCount;


    public:
        void swap (int *a, int *b)  
{  
    int temp = *a;  
    *a = *b;  
    *b = temp;  
}  
void printArray (int arr[], int n)  
{  
    for (int i = 0; i < n; i++)  
        cout << arr[i] << " ";  
    cout << "random calls: " << indexCount <<endl; 

}  
  void randomize (int arr[], int n)  
{  
   indexCount=0;
    srand (time(NULL));  


    for (int i = n - 1; i > 0; i--)  
    {  

        int j = rand() % (i + 1);  
        indexCount++;



        swap(&arr[i], &arr[j]);  
    }  
}


};

class numbersVector{
    private:

            vector <int>numberList;
    public:
        numbers num;
        void storeInVector(int arr[], int n){
            for (int i=0; i <10; i++){

                num.randomize(arr,n);
                num.printArray(arr,n);
                numberList.push_back(arr[i]);

            }
            cout <<endl <<endl;


        }
};
int main(){
    numbers numbers;
    numbersVector nv;
     int arr[] = {1, 2, 3, 4, 5, 6, 0, 0, 0};  
    int n = sizeof(arr) / sizeof(arr[0]);  
    //numbers.randomize(arr, n);  
   // numbers.printArray(arr, n);  
    nv.storeInVector(arr,n);
    return 0;
}

во втором классе il oop над моими функциями в первом классе для создания списка 10, теперь я застрял при сохранении рандомизированного списка в вектор. Моя проблема в том, что я могу хранить только числа из каждого списка в векторе, но я бы хотел сохранить 10 списков внутри вектора. EG

for (int i = 0; i <numberList.size(); i++)
{
cout <<numberList[i] <<endl;
}

Я бы хотел, чтобы мой вывод был:

123456000 random calls: 8
02103654 random calls:8

и т. Д. В 10 раз.

РЕДАКТИРОВАНИЕ ПОЧТЫ, ЧТОБЫ БОЛЬШЕ ОЧИСТИТЬ: так что у меня есть массив

arr[] = {1,2,3,4,5,6,0,0,0}

после моей функции рандомизации я получаю вывод наподобие {2,1,0,0,6,0,4,3,5}, а затем создаю al oop для запуска моей рандомизации функционировать 10 раз. ie 1) 1,0,0,0,2,5,4,3,6 2) 6,0,5,0,4,0,3,2,1 3) 5,1,0,0 , 2,0,3,6,4 .... 10) 2,1,0,0,6,0,4,3,5

Затем я хотел бы сохранить каждый сгенерированный список в вектор IE

vector <int> numlist;
numList[1] = {1,0,0,0,2,5,4,3,6}
numList[2] = {6,0,5,0,4,0,3,2,1}

и т. д.

1 Ответ

0 голосов
/ 06 марта 2020

Списки не сплющены в C ++, как в некоторых языках (особенно perl). Вам нужно указать, куда вы хотите вставить элементы в вашем новом списке и какой диапазон вы хотите insert:

numberList.insert(numberList.end(), std::begin(new_list), std::end(new_list);

Это позволит вставить полный диапазон new_list в конец вашего numberList.

Также: как упоминалось @ scohe001, используйте <random> поддерживаемые функции для получения хорошей рандомизации.

Пример:

#include <random>

inline std::mt19937& generator() {
    static thread_local std::mt19937 gen(std::random_device{}());
    return gen;
}

//...

    std::shuffle( numberList.begin(), numberList.end(), generator() );

Пример после комментариев:

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

inline std::mt19937& generator() {
    static thread_local std::mt19937 gen(std::random_device{}());
    return gen;
}

int main() {
    // a vector of vectors (not the most optimal but for this purpose, good enough)
    std::vector<std::vector<int>> result;

    std::vector<int> array{1, 2, 3, 4, 5, 6, 7, 8, 9};

    for(int i = 0; i < 10; ++i) {
        std::shuffle(array.begin(), array.end(), generator());

        // pushing back an array (or better, a vector) into the vector
        result.push_back(array);
    }

    //-- present the result
    std::cout << result.size() << " random permutations (possibly duplicates):\n";
    for(const auto& inner : result) {
        for(int value : inner) {
            std::cout << value << ' ';
        }
        std::cout << '\n';
    }
}

Демо

Если по какой-то причине вы не можете использовать std::shuffle, вы можете сделать свой собственный, добавив функцию для генерации случайных чисел, а затем от одного до l oop над vector и замены случайных позиций в нем.

Пример:

// generate a random number in the range [min, max]
template<typename T, std::enable_if_t<std::is_integral_v<T>>* = nullptr>
T my_rand(T min, T max) {
    std::uniform_int_distribution<T> dist(min, max);
    return dist(generator());
}

// a shuffle-like function
void shake_it(std::vector<int>& c) {
    for(size_t i = 0; i < c.size(); ++i) {
        std::swap(c[i], c[my_rand(0ul, c.size() - 1)]);
    }
}

Затем вызовите его с помощью shake_it(array); и должны быть правильно рандомизированы.

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