我有一个整数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行然后显示数据。为什么?
答案 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