Удалить первое наименьшее число в векторе в C ++ (и сохранить порядок) - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть vector<int> number_vector, который содержит {1, 0, 0, 0, 0, 0 ,0}. Мне нужно перебрать эту number_vector, например, 4 раза, и удалить первое наименьшее число на каждой итерации, т.е. на первой итерации я буду удалять значение 0 с индексом 1, на следующей итерации я будуудалите 0, который находится в индексе 1, и т. д. Я делаю это прямо сейчас следующим образом:

int n = 7;

int d = 4;

vector<int> number_vector{1, 0, 0, 0, 0, 0 ,0};

for (int counter = 0; counter < n - d; counter++)
{
    int index = distance(number_vector.begin(), min_element(number_vector.begin(), number_vector.end()));

    if (index != number_vector.size() - 1)
    {
        number_vector[index] = move(number_vector.back());
    }

    number_vector.pop_back();

    // number_vector.erase(number_vector.begin() + index);
}

Проблема в том, что если я запускаю код выше, в концеnumber_vector имеет {1, 0, 0, 0}, в то время как он должен иметь {1, 0, 0}, а для других случаев, таких как n = 4, d = 2 и number_vector{3, 7, 5, 9}, конечный number_vector имеет правильное значение, то есть 79. Несколько советов?

Ответы [ 3 ]

1 голос
/ 02 ноября 2019

Является ли ваше d временем всплывающего минимального числа из вектора?
Затем измените counter < n - d на counter < d, оно будет иметь {1, 0, 0}

11.04, если вы хотите сохранитьпорядок, вы можете изменить

for (int counter = 0; counter < d; ++counter)
{
    auto iter = min_element(number_vector.begin(), number_vector.end());
    number_vector.erase(iter);
}

PS: std::list может быть, лучший выбор?

1 голос
/ 02 ноября 2019

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

0 голосов
/ 02 ноября 2019

Когда вы итерируете от 0 до nd, с n = 7 и d = 4. вы будете выполнять итерацию от counter = 0 до counter <7-4, то есть 3. Таким образом, ваш цикл будет повторяться 3 раза со значениями 0, 1 и 2. Это удалит три нуля из number_vector. Таким образом, ваш код ведет себя как ожидалось. </p>

Я думаю, что вам нужно перебрать от 0 до d. Также вы излишне усложняете код, используя индекс. Вы можете использовать итератор, как показано ниже.

for (int counter = 0; counter < d; counter++)
{   
    *min_element(number_vector.begin(), number_vector.end()) = *number_vector.rbegin();
    number_vector.pop_back();
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...