将列表作为输入直到输入被按下

时间:2014-08-03 09:27:23

标签: c++ c++11

我有一个整数N.接下来N行包含可以有1-100的不同元素的列表。但我没有提供每个列表的长度。如何处理这种类型的输入。

如果说我有矢量> MYLIST;

我需要使用下一行分隔的列表来填充此列表。

说N = 3

1 2 3
4
5 6

然后mylist [0] = [1,2,3],mylist [1] = [4],mylist [2] = [5,6]。

如何在c ++中完成?

Mycode:不正确,但我试过了。

int main(){
int t;
cin>>t;
cin.ignore();
while(t--){
    int n;
    cin>>n;
    cin.ignore();
    lists_t lists;
    std::string record;
    while ( std::getline( std::cin, record ) && 
        record.find_first_not_of( ' ' ) != std::string::npos && lists.size()!=n)
    {
        std::istringstream is( record );

        lists.push_back( std::vector<int>( std::istream_iterator<int>( is ), 
                     std::istream_iterator<int>() ) );
    }

    for ( const auto &l : lists )
    {
        for ( int x : l ) std::cout << x << ' ';
        std::cout << std::endl;
    }
   }
 }

问题在于,如果我输入t = 1且n = 3,那么不是跟随n行而是需要4行然后显示数据。为什么?

1 个答案:

答案 0 :(得分:0)

您可以使用标准函数std::getline和字符串流std::stringstream,当然还可以使用容器std::list本身。

这是一个例子

#include <iostream>
#include <iterator>
#include <list>
#include <sstream>
#include <string>


int main()
{
    std::list<std::list<int>> lst;
    std::string record;

    while ( std::getline( std::cin, record ) && 
            record.find_first_not_of( ' ' ) != std::string::npos )
    {
        std::istringstream is( record );

        lst.push_back( std::list<int>( std::istream_iterator<int>( is ), 
                         std::istream_iterator<int>() ) );
    }

    for ( const auto &l : lst )
    {
        for ( int x : l ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    return 0;
}

输出

1 2 3 
4 
5 6

如果输入是相同的行。

如果您需要输入给定数量的行,则代码可以采用以下方式

#include <iostream>
#include <iterator>
#include <list>
#include <sstream>
#include <string>

int main()
{
    std::list<std::list<int>> lst;
    std::string record;

    size_t n;

    std::cin >> n;
    std::cin.ignore();

    while ( n-- && 
            std::getline( std::cin, record ) && 
            record.find_first_not_of( ' ' ) != std::string::npos )
    {
        std::istringstream is( record );

        lst.push_back( std::list<int>( std::istream_iterator<int>( is ), 
                         std::istream_iterator<int>() ) );
    }

    for ( const auto &l : lst )
    {
        for ( int x : l ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    return 0;
}

输入可能看起来像

3
1 2 3
4
5 6