从数组中删除奇数元素
#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