从数组中删除奇数元素

复制代码
#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 @   你好阿汤哥  Views(2504)  Comments(0Edit  收藏  举报
编辑推荐:
· 大模型 Token 究竟是啥:图解大模型Token
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
阅读排行:
· BotSharp + MCP 三步实现智能体开发
· 动物智能之数据标注员——狗篇
· 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
· 设计模式脉络
· 「硬核实战」回调函数到底是个啥?一文带你从原理到实战彻底掌握C/C++回调函数
点击右上角即可分享
微信分享提示