对于您当前的示例,您应该使用std::string 而不是std::array<char, 10>。但是,如果您仍然想读取一个数组,您可以按如下方式进行:
#include <iostream>
#include <array>
int main() {
std::array<int, 10> arr;
for(int temp, i = 0; i < arr.size() && std::cin >> temp; ++i) {
arr[i] = temp;
}
for(auto&& i : arr) {
std::cout << i << ' ';
}
}
输出:
$ ./a.out
10 11 12 13 14 15 16 17 18 19
10 11 12 13 14 15 16 17 18 19
基本思想是循环直到数组大小,然后使用其operator[] 将其插入到数组中。您将std::cin >> temp 保留在循环条件中以捕获插入过程中的错误。请注意,标准库中没有为您执行此操作的内置函数。
如果你发现自己经常这样做,你可以把它移到你自己的函数中:
#include <iostream>
#include <array>
template<typename T, size_t N>
std::istream& input_array(std::istream& in, std::array<T, N>& arr) {
unsigned i = 0u;
for(T temp; i < arr.size() && in >> temp; ++i) {
arr[i] = std::move(temp);
}
return in;
}
int main() {
std::array<int, 10> arr;
input_array(std::cin, arr);
}
您不应该为 std 命名空间内的东西重载 operator>>,因为这是未定义的行为。
如果你想避免临时的,你可以修改函数如下:
template<typename T, size_t N>
std::istream& input_array(std::istream& in, std::array<T, N>& arr) {
for(unsigned i = 0u; i < arr.size() && in >> arr[i]; ++i) {
// empty body
}
return in;
}