2011-04-24 74 views
1

如果我在一行上有空格分隔的整数列表(例如:50 34 1 3423 5 345),那么将它们中的每一个作为单独的整数变量的最佳方式是 - 收集列表整数与cin随机整数列表

回答

7

在后续sehe的答案,这里是你会怎么做稍微详细些(ahem)。

sehe使用的算法基本上内部做到这一点。这个答案主要是为了清晰。

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> myInts; 

    int tmp; 
    while (std::cin >> tmp) { 
     myInts.push_back(tmp); 
    } 

    // Now `myInts` is a vector containing all the integers 
} 

Live example.

+0

+1合合。感谢您接受我的工作来解释这个尴尬的STL-ese :)我想在实践中,我实际上会提出这个建议。尽管如此,我确实更喜欢稍微纯粹的理由来处理这个算法。 – sehe 2011-04-24 20:36:41

+0

+1为*答案主要是为了清晰*。 – Nawaz 2011-04-24 20:40:21

+0

+1为活的例子 - 非常有帮助。 – 2011-04-24 20:49:29

8
#include <iostream> 
#include <vector> 
#include <iterator> 

std::vector<int> ints; 
std::copy(std::istream_iterator<int>(cin), 
     std::istream_iterator<int>(), 
     std::back_inserter(ints)); 

完成。如果你真的需要explicetely读行明智:

#include <sstream> 
#include <iostream> 
#include <vector> 
#include <iterator> 

std::string singleline; 
std::istringstream iss; // out of loop for performance 
while (std::getline(cin, singleline)) 
{ 
     iss.str(singleline); 
     std::copy(std::istream_iterator<int>(iss), 
      std::istream_iterator<int>(), 
      std::back_inserter(ints)); 
} 

istream_iterator<int>将重复应用operator>>(int&)所引用的流(直到流的末尾)。默认情况下,这会默默地忽略空格,它会抛出一个异常,如果输入的操作失败(如非整数输入遇到)

的back_inserter是输出迭代,你可以与所有类型的容器使用(如vector)支持.push_back操作。所以其实什么STL algorithmese写有类似

std::vector<int> ints; 
while (iss>>myint) 
{ 
    ints.push_back(myint); 
} 
+0

谢谢 - 护理解释什么......任何的那个呢? – pighead10 2011-04-24 20:30:26

+0

好的,稍后再回来查看 – sehe 2011-04-24 20:31:17

+0

@sehe - 你不觉得这个答案对于OP来说有点过于基本吗? – 2011-04-24 20:31:24

0

看看man页面strtok()atoi()

+1

Ew。现在是21世纪,哥们。 – 2011-04-24 20:31:19

+0

@Tomalak Geret'kal - 上帝保佑我在马车鞭子上的投资! – 2011-04-24 20:38:05

+0

为什么要写作业标签? – pighead10 2011-04-24 21:11:32