zoukankan      html  css  js  c++  java
  • 从数组中删除奇数元素

    #include <iostream>
    #include <cstdint>
    #include <vector>
    
    // 要求:从很大的数组中删除删除某些特定的元素
    // 思路:由于是数组,不要尝试直接删除,否则会导致大量内存拷贝,最好的方法就是元素交换
    
    // 从很大的数组中删除奇数元素
    void remove_cardinal(std::vector<int32_t> & vec)
    {
        std::vector<int32_t>::size_type i = 0, j = vec.size() - 1;
        while(i < j)
        {
            while(i < j && vec[i] % 2 == 0)++i;
            while(i < j && vec[j] % 2 == 1)--j;
            std::swap(vec[i], vec[j]);
        }
        vec.resize(i);
    }
    
    // 从很大的数组中删除奇数元素,但是要保持偶数元素的原有顺序
    void remove_cardinal_stable(std::vector<int32_t> & vec)
    {
        std::vector<int32_t>::size_type i = 0, j = 0;
        while(i < vec.size() && j < vec.size())
        {
            while(i < vec.size() && vec[i] % 2 == 0)++i;
            j = i + 1;
            while(j < vec.size() && vec[j] % 2 == 1)++j;
            if(j < vec.size())
            {
                std::swap(vec[i], vec[j]);
            }
        }
        vec.resize(i);
    }
    
    int32_t main()
    {
        {
            std::vector<int32_t> vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            remove_cardinal(vec);
            for(int32_t & v : vec)
            {
                std::cout << v << " ";
            }
            std::cout << std::endl;
        }
        {
            std::vector<int32_t> vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            remove_cardinal_stable(vec);
            for(int32_t & v : vec)
            {
                std::cout << v << " ";
            }
            std::cout << std::endl;
        }
        return 0;
    }

    输出结果:

    10 2 8 4 6
    2 4 6 8 10
  • 相关阅读:
    2015.4.16-C#中ref和out的区别
    2015.4.10-SQL 高级查询(二)
    2015.4.10-C#入门基础(三)
    2015.4.8-C#入门基础(二)
    2015.4.7-C#入门基础(一)
    2015.4.2-SQL 简单语句(一)
    对GridView的某一列行进行操作。。
    jquery获取GridView中RadioButton选中的数据
    Ajax获取前台的数据
    前台验证
  • 原文地址:https://www.cnblogs.com/tangxin-blog/p/8831931.html
Copyright © 2011-2022 走看看