如何从cin到一行中的vector.push_back()获取值?

时间:2017-01-16 00:19:52

标签: c++

我可以在一行中完成吗?

int temp;
cin >> temp;
vtr.push_back(temp);

对于奖励积分,还有一种方法可以包含for-loop替代

 for(int i=0; i < 5; i++){
    int temp;
    cin >> temp;
    vtr.push_back(temp);
}

警告我不能像while(cin >> myInt)这样做,因为读入文件有多行,但我只想一次阅读5行。我也不知道如何用像vtr.push_back(cin >> ??? )

这样的cin来做一个oneliner

3 个答案:

答案 0 :(得分:3)

您可以使用std::istream_iterator<>。这是一个从stdin:

的内容构造std::vector的示例
#include <iostream>
#include <vector>

int main(int argc, char **argv) {
    std::vector<int> vec{
        std::istream_iterator<int>(std::cin),
        std::istream_iterator<int>()};
    for (int i : vec) {
        std::cout << i << '\n';
    }
    return 0;
}

如果您愿意,可以在循环中使用push_back

#include <iostream>
#include <vector>

int main(int argc, char **argv) {
    std::vector<int> vec;
    for (std::istream_iterator<int> p{std::cin}, e; p != e; ++p) {
        vec.push_back(*p);
    }
    for (int i : vec) {
        std::cout << i << '\n';
    }
    return 0;
}

答案 1 :(得分:2)

  

我可以在一行中完成吗?

不是直接的,但你可以包装它:

template<typename ContainerType>
void readValue(std::istream &in, ContainerType &container)
{
    ContainerType::value_type temp;
    if (in >> temp)
        container.push_back(temp);
}

然后这是一个单行电话:

readValue(cin, vtr);
  

对于奖励积分,还有一种方法可以包含for-loop替代

如果您使用的是C ++ 11或更高版本,则可以std::copy_n()使用std::istream_iteratorstd::back_inserter使用{{3}}:

std::copy_n(std::istream_iterator<int>(std::cin), 5, std::back_inserter(vtr));

否则,只需使用手动循环:

for (int i = 0; i < 5; ++i) readValue(cin, vtr);

答案 2 :(得分:1)

除了另一个答案中显示的迭代器解决方案之外,您可以在向量的末尾添加五个元素,然后从流中读取新的值:

auto n = vtr.size();
vtr.resize(n + 5);
if (std::cin >> vtr[n] >> vtr[n+1] >> vtr[n+2] >> vtr[n+3] >> vtr[n+4])
{ }
else
{ /* report error */ }