从数组中删除奇数元素

#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

 

posted @ 2018-04-14 15:03  你好阿汤哥  Views(2489)  Comments(0Edit  收藏  举报