从数组中删除奇数元素
#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
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划
· 想让你多爱自己一些的开源计时器
· 大模型 Token 究竟是啥:图解大模型Token
· 用99元买的服务器搭一套CI/CD系统
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争