wired.cpp
· 2.1 KiB · C++
Неформатований
#include <iostream>
#include <vector>
#include <array>
#include <string>
#include <algorithm>
#include <ranges>
#include <utility>
// 1. 正常人类 (C++98)
void print_evens_c98(int arr[], int size) {
for (int i = 0; i < size; i++) {
if (arr[i] % 2 == 0) {
std::cout << arr[i] << " ";
}
}
}
// 2. 稍微不正常 (C++11)
void print_evens_c11(const std::vector<int>& nums) {
std::for_each(nums.begin(), nums.end(), [](int n) {
if (n % 2 == 0) {
std::cout << n << " ";
}
});
}
// 3. 再不正常一点 (C++20)
void print_evens_c20(const std::vector<int>& nums) {
for (int n : nums | std::views::filter([](int n) { return n % 2 == 0; })) {
std::cout << n << " ";
}
}
// 4. 特别不正常 (C++20 纯编译期)
template <size_t... Is>
constexpr auto get_even_numbers_string_helper(const std::array<int, sizeof...(Is)>& arr, std::index_sequence<Is...>) {
auto filter_and_convert = [&](auto index) constexpr {
if (arr[index] % 2 == 0) {
// Returns an empty string literal to avoid runtime heap allocation
return std::to_string(arr[index]) + " ";
}
return std::string("");
};
return (filter_and_convert(Is) + ...);
}
template <size_t N>
void print_even_in_array(const std::array<int, N>& arr) {
std::cout << get_even_numbers_string_helper(arr, std::make_index_sequence<N>{});
}
int main() {
int arr[] = {5, 2, 8, 1, 6};
std::vector<int> nums_vec = {5, 2, 8, 1, 6};
constexpr std::array<int, 5> nums_arr_constexpr = {5, 2, 8, 1, 6};
std::cout << "1. 正常人类 (C++98):" << std::endl;
print_evens_c98(arr, 5);
std::cout << "\n\n";
std::cout << "2. 稍微不正常 (C++11):" << std::endl;
print_evens_c11(nums_vec);
std::cout << "\n\n";
std::cout << "3. 再不正常一点 (C++20):" << std::endl;
print_evens_c20(nums_vec);
std::cout << "\n\n";
std::cout << "4. 特别不正常 (C++20 纯编译期):" << std::endl;
print_even_in_array(nums_arr_constexpr);
std::cout << "\n";
return 0;
}
| 1 | #include <iostream> |
| 2 | #include <vector> |
| 3 | #include <array> |
| 4 | #include <string> |
| 5 | #include <algorithm> |
| 6 | #include <ranges> |
| 7 | #include <utility> |
| 8 | |
| 9 | // 1. 正常人类 (C++98) |
| 10 | void print_evens_c98(int arr[], int size) { |
| 11 | for (int i = 0; i < size; i++) { |
| 12 | if (arr[i] % 2 == 0) { |
| 13 | std::cout << arr[i] << " "; |
| 14 | } |
| 15 | } |
| 16 | } |
| 17 | |
| 18 | // 2. 稍微不正常 (C++11) |
| 19 | void print_evens_c11(const std::vector<int>& nums) { |
| 20 | std::for_each(nums.begin(), nums.end(), [](int n) { |
| 21 | if (n % 2 == 0) { |
| 22 | std::cout << n << " "; |
| 23 | } |
| 24 | }); |
| 25 | } |
| 26 | |
| 27 | // 3. 再不正常一点 (C++20) |
| 28 | void print_evens_c20(const std::vector<int>& nums) { |
| 29 | for (int n : nums | std::views::filter([](int n) { return n % 2 == 0; })) { |
| 30 | std::cout << n << " "; |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | // 4. 特别不正常 (C++20 纯编译期) |
| 35 | template <size_t... Is> |
| 36 | constexpr auto get_even_numbers_string_helper(const std::array<int, sizeof...(Is)>& arr, std::index_sequence<Is...>) { |
| 37 | auto filter_and_convert = [&](auto index) constexpr { |
| 38 | if (arr[index] % 2 == 0) { |
| 39 | // Returns an empty string literal to avoid runtime heap allocation |
| 40 | return std::to_string(arr[index]) + " "; |
| 41 | } |
| 42 | return std::string(""); |
| 43 | }; |
| 44 | return (filter_and_convert(Is) + ...); |
| 45 | } |
| 46 | |
| 47 | template <size_t N> |
| 48 | void print_even_in_array(const std::array<int, N>& arr) { |
| 49 | std::cout << get_even_numbers_string_helper(arr, std::make_index_sequence<N>{}); |
| 50 | } |
| 51 | |
| 52 | int main() { |
| 53 | int arr[] = {5, 2, 8, 1, 6}; |
| 54 | std::vector<int> nums_vec = {5, 2, 8, 1, 6}; |
| 55 | |
| 56 | constexpr std::array<int, 5> nums_arr_constexpr = {5, 2, 8, 1, 6}; |
| 57 | |
| 58 | std::cout << "1. 正常人类 (C++98):" << std::endl; |
| 59 | print_evens_c98(arr, 5); |
| 60 | std::cout << "\n\n"; |
| 61 | |
| 62 | std::cout << "2. 稍微不正常 (C++11):" << std::endl; |
| 63 | print_evens_c11(nums_vec); |
| 64 | std::cout << "\n\n"; |
| 65 | |
| 66 | std::cout << "3. 再不正常一点 (C++20):" << std::endl; |
| 67 | print_evens_c20(nums_vec); |
| 68 | std::cout << "\n\n"; |
| 69 | |
| 70 | std::cout << "4. 特别不正常 (C++20 纯编译期):" << std::endl; |
| 71 | print_even_in_array(nums_arr_constexpr); |
| 72 | std::cout << "\n"; |
| 73 | |
| 74 | return 0; |
| 75 | } |