c ++输入到vector的行

时间:2017-06-11 10:36:50

标签: c++ vector input

我的目标是在输入后立即向输入添加输入行(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循环中,第一个值被忽略,它跳到第二个。我该怎么处理?

2 个答案:

答案 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 << ' ';
}

Live Example

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 << ' ';
}

Live Example