代码之家  ›  专栏  ›  技术社区  ›  koka

如何从一个向量中删除最小元素并将其添加到另一个向量,而第一个变为空?

  •  0
  • koka  · 技术社区  · 6 年前

    如何从一个向量中删除最小元素并将其添加到另一个向量中,而第一个向量变为空`
    这不起作用:/ 看起来像selectsort算法

    #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 回复  |  直到 6 年前
        1
  •  1
  •   DimChtz    6 年前

    应该是这样的:

    #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;
    
    }
    
        2
  •  1
  •   Slava    6 年前

    不清楚为什么目标尺寸 v2 v1.size() - 1 ,在对所有元素排序后 v1.size() 应为0和 v2.size() 等于的大小 v1 排序前。排序不正确的问题-您初始化 ind 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 );
    }