我的目标是在输入后立即向输入添加输入行(Enter hit)。 例如:
“1 2 3 4 5 6” - 线路输入
成为持有该数字的载体
代码尝试了:
int arrLength = validateArrLength("Enter array length: ");
vector<int> arr;
int counter = 1;
cout << "Enter values:" << endl;
string in;
cin.ignore();
getline(cin, in, ' ');
while (cin >> in && counter < arrLength){
arr.push_back(atoi(in.c_str()));
++counter;
}
问题是在while循环中,第一个值被忽略,它跳到第二个。我该怎么处理?
答案 0 :(得分:3)
你应该有这样简单的代码:
int arrLength = validateArrLength("Enter array length: ");
vector<int> arr;
for(int val, i = 0;(cin >> val) && i < arrLength; ++i){
arr.push_back(val);
}
答案 1 :(得分:2)
我建议你避免使用raw循环并使用标准库来代替。为了实现它,有几个结构汇集在一起:
#include <algorithm>
#include <iterator>
#include <vector>
#include <iostream>
int main() {
std::vector<int> arr;
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
back_inserter(arr));
for(int i : arr)
std::cout << i << ' ';
}
std::istream_iterator
旨在以您需要的确切形式处理输入(空格分隔的行)。它还会更加稳健地检测流的结束。
然后将istream_iterator
创建的虚拟“输入范围”输入std::copy
算法。这很明显,并将范围中的每个元素分配给std::back_inserter
返回的迭代器。这个赋值实质上只是对arr.push_back
的调用的包装器。
如果您确实只想复制到某个点,则标准库没有copy_until
算法。但是推出我们自己的并不难:
#include <iterator>
#include <vector>
#include <iostream>
template<typename InputIt, typename ForwardIt, typename UnaryPred>
void copy_until(InputIt start, InputIt end, ForwardIt d_first, UnaryPred p) {
while(start != end && p(*start))
*d_first++ = *start++;
}
int main() {
std::vector<int> arr;
int count = 0;
copy_until(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
back_inserter(arr), [&](int) {
return ++count < 3;
});
for(int i : arr)
std::cout << i << ' ';
}