從數組中刪除奇數元素

#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;
}

輸出結果:ios

10 2 8 4 6
2 4 6 8 10
相關文章
相關標籤/搜索