Onk*_*jan 3 c++ c++11 c++14 c++20
我有一个数组(例如,,unsigned int arr[1000])。
我想像这样初始化数组的元素..
arr = {4, 10, 34, 45, 6, 67, UINT_MAX, UINT_MAX .. 994 times}
Run Code Online (Sandbox Code Playgroud)
那是在我分配一些值之前,我希望数组中的默认值是 UINT_MAX。
有没有办法做到这一点?
当然 for 循环总是存在的,但除此之外还有其他任何方式。
请使用 2 阶段方法。首先,使用一个初始化列表,然后用std::fill
#include <limits>
#include <algorithm>
constexpr size_t ArraySize = 1000U;
int main() {
int arr[ArraySize] = { 4,10,34,45,6,67 };
std::fill(arr + 6U, arr + ArraySize, std::numeric_limits<int>::max());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用std::fill:
unsigned int array[5];
std::fill(array, array + 5, UINT_MAX);
Run Code Online (Sandbox Code Playgroud)
unsigned int array[5];
int count = 5; // - number of elements to modify
auto value = UINT_MAX; // - the value to be assigned
std::fill_n(array, count, value);
Run Code Online (Sandbox Code Playgroud)
或者,考虑使用std::array代替。它是 C 风格数组的一个薄包装器,带有一些额外的东西,比如迭代器和size()函数。此外,它不会自动衰减为指针。
扩展下面@Evg 的评论,更惯用、通用、安全和可靠的方法是使用库提供的功能:
unsigned int array[5];
std::fill(array, array + 5, UINT_MAX);
Run Code Online (Sandbox Code Playgroud)
上述方法的优点是显而易见的:
std::vectoror std::array,就不必更改上述代码中的任何其他部分。以下允许您对任何类型、大小和默认值执行您想做的操作:
template<typename T, size_t Size, size_t N, size_t... In, size_t... Isize>
constexpr std::array<T, Size> make_array_impl(const T(&user_supplied)[N], T default_value, std::index_sequence<In...>, std::index_sequence<Isize...>)
{
return {user_supplied[In]..., (Isize, default_value)...};
}
template<typename T, size_t Size, size_t N>
constexpr std::array<T, Size> make_array(const T(&user_supplied)[N], T default_value)
{
static_assert(N <= Size, "bla bla bla");
return make_array_impl<T, Size> (user_supplied, default_value, std::make_index_sequence<N>{}, std::make_index_sequence<Size - N>{});
}
Run Code Online (Sandbox Code Playgroud)
你可以这样使用它:
int main()
{
auto arr = make_array<unsigned int, 1000>({4, 10, 34, 45, 6, 67}, UINT_MAX); // expands to arr = {4, 10, 34, 45, 6, 67, UINT_MAX... 994 times}
}
Run Code Online (Sandbox Code Playgroud)