Манипулирующие векторы - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь создать массив объектов типа teaStep, а также пытаюсь переупорядочить список в случайный список.

Функция makeSteps предназначена для инициации переменных, сохранения их в массиве и вывода их. Функция randomizeSteps предназначена для создания массива целых и рандомизации их порядка перед выводом нового массива. Просто интересно, если это правильный способ сделать это. [Редактировать] Используя вектор, теперь у меня есть это:

  auto makeSteps()
{
    auto all_steps = std::vector<teaStep>{};
    all_steps.emplace_back("Pick your tea", 1);
    all_steps.emplace_back("Boil water", 2);
    all_steps.emplace_back("Get tea bag in mug or pot", 3);
    all_steps.emplace_back("Pour boiled water over teabag", 4);
    all_steps.emplace_back("Wait!", 5);
    all_steps.emplace_back("Remove teabag", 6);
    all_steps.emplace_back("Add milk and/ or sugar", 7);
    all_steps.emplace_back("Mix, drink and enjoy", 8);


    return all_steps;
}

   auto randomizeSteps()
{
    vector <int> ranstep;
    for (int i = 1; i < 9; i++)
        ranstep.push_back(i);
    auto rng = std::default_random_engine{};
    std::shuffle(std::begin(ranstep), std::end(ranstep), rng);
    return ranstep;
}

Чтобы добавить к этому, как только это будет завершено, я должен быть в состоянии использовать объекты в векторах, однако, когда я пытаюсь это сделать, я получаю ошибку, пример ниже:

//should go through the object in vectors, and compare the field Order, to int a.
teaStep findStep(int a, std::vector<teaStep> vectors)

{
    for (int b = 0; b < 8; b++)
    {
        teaStep test = vectors[b];
        if (test.getOrder == a)
            return test;
    }
}

Ошибка, которую я получаю: «нет преобразования из int в int (...»

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

В дополнение к тому, что сказал @YSC, не используйте std:random_shuffle.Это устарело .

Используйте std::shuffle вместо.

#include <algorithm>
#include <random>

auto makeSteps()
{
    auto steps = std::vector<teaStep>{};
    steps.emplace_back("Pick your tea", 1);
    steps.emplace_back("Boil water", 2);
    steps.emplace_back("Get tea bag in mug or pot", 3);
    steps.emplace_back("Pour boiled water over teabag", 4);
    steps.emplace_back("Wait!", 5);
    steps.emplace_back("Remove teabag", 6);
    steps.emplace_back("Add milk and/ or sugar", 7);
    steps.emplace_back("Mix, drink and enjoy", 8);
    return steps;
}


auto randomizeSteps()
{
    std::vector<int> ranstep(10) ; // vector with 10 ints.
    std::iota (std::begin(v), std::end(v), 0); // Fill with 0, 1, ..., 9.
    auto rng = std::default_random_engine{};
    std::shuffle(std::begin(ranstep), std::end(ranstep), rng);
    return ranstep;
}
0 голосов
/ 25 июня 2018

Вы возвращаете указатель на локальную переменную здесь:

    teaStep arr[] = /* ... */;
    return arr;
}

Срок действия arr заканчивается, как только вы выходите из makeSteps (при закрытии }). И всякий раз, когда вы манипулируете возвращаемым значением makeSteps, вы получаете мусор.

Попробуйте использовать std::vector вместо простых массивов C, например:

auto make_steps()
{
    auto steps = std::vector<teaStep>{};
    steps.emplace_back("Pick your tea", 1);
    steps.emplace_back("Boil water", 2);
    steps.emplace_back("Get tea bag in mug or pot", 3);
    steps.emplace_back("Pour boiled water over teabag", 4);
    steps.emplace_back("Wait!", 5);
    steps.emplace_back("Remove teabag", 6);
    steps.emplace_back("Add milk and/ or sugar", 7);
    steps.emplace_back("Mix, drink and enjoy", 8);
    return steps;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...