как стереть элемент min из одного вектора и добавить к другому, пока первый стал пустым? - PullRequest
0 голосов
/ 10 мая 2018

как стереть элемент min из одного вектора и добавить к другому, когда сначала станет пустым? `
это не работает: / похоже на алгоритм выбора сортировки

#include<iostream>
#include<vector>
using namespace std;
void print(vector<int>&vec) {
    for (int i = 0; i < vec.size(); i++)
        cout << vec[i] << endl;
}


int main()
{
    vector<int>v1{ 458,525,255,336,258 };
    int size = v1.size() - 1;
    vector<int>v2;
    int min = v1[0];
    int i;
    int ind = 0;
    while (v2.size() != size) {
        for (i = 1; i < v1.size(); i++)
        {
            if (v1[i] < min)
            {
                min = v1[i];
                ind = i;
            }
        }
        v2.push_back(min);
        v1.erase(v1.begin() + ind);
    }
    print(v1);
    cout << " " << endl;
    print(v2);

}

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вот как это должно быть:

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

int main() {

    std::vector<int> v1{ 458, 525, 255, 336, 258 };
    std::vector<int> v2;

    while ( v1.size() ) {

        auto m = std::min_element(v1.begin(), v1.end());
        v2.push_back(*m);
        v1.erase(m);

    }

    for (auto v : v1) std::cout << v << " "; std::cout << "\n";
    for (auto v : v2) std::cout << v << " "; std::cout << "\n";

    return 0;

}
0 голосов
/ 10 мая 2018

Непонятно, почему целевой размер для v2 равен v1.size() - 1, после сортировки всех элементов v1.size() должно быть равно 0, а v2.size() равно размеру v1 перед сортировкой.Проблема с неправильной сортировкой - вы инициализируете ind и min в неправильном месте.Он должен быть внутри первого цикла (и учтите, что вам не нужно сохранять значение min, достаточно индекса):

while (v1.size()) {
    size_t ind = 0;
    for (size_t i = 1; i < v1.size(); i++)
    {
        if (v1[i] < v1[ind])
        {
            ind = i;
        }
    }
    v2.push_back(v1[ind]);
    v1.erase(v1.begin() + ind);
}

Но лучше использовать стандартный алгоритм std::min_element():

while( not v1.empty() ) {
    auto it = std::min_element( v1.begin(), v1.end() );
    v2.push_back( *it );
    v1.erase( it );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...