【发布时间】:2015-11-25 23:06:36
【问题描述】:
我得到一个由 n 个整数组成的输入字符串,用逗号分隔(例如“23,4,56”)。我需要设置一个字符串流来表示这个字符串,然后用它将每个整数扫描成一个向量。向量的元素(列表中的整数)最终将逐行输出。我得到了 main(),并且只负责编写 parseInts(string str)。出于某种原因,我一直在超时。我猜这是我的while循环中的一些东西,特别是关于我如何用str()操作我的sstream,但我无法弄清楚到底发生了什么。我是 sstream 和 C++ 的新手,所以任何帮助都将不胜感激!
#include <sstream>
#include <vector>
#include <iostream>
using namespace std;
vector<int> parseInts(string str) {
int a; //will use this to hold the value of the 1st int in the sstream
stringstream list_initial; //will iterate over this sstream
list_initial.str(str); //set sstream to represent input str
vector<int> list_final; //will return this final vector for output in main
while (!list_initial.str().empty()){ //stop iterating at end of string
list_initial>>a; //store leading int value in a
list_final.push_back(a); //add a to end of vector
while (!ispunct(list_initial.str()[0])){ //get to next int in list
list_initial.str(list_initial.str().erase(0,1));
};
list_initial.str(list_initial.str().erase(0,1)); //erase leading comma
};
return list_final;
};
int main() {
string str;
cin >> str;
vector<int> integers = parseInts(str);
for(int i = 0; i < integers.size(); i++) {
cout << integers[i] << "\n";
}
return 0;
}
【问题讨论】:
-
“超时”是什么意思?如果您的代码运行缓慢,我怀疑这是因为您正在创建所有 std::strings。 std::stringstream 和其他流一样是流,您应该这样对待它。您无需继续创建 str()ing 或重置流的 str()ing。
-
这是什么意思?我真的不明白流是如何工作的。我认为理想情况下我可以编写一些只使用在列表中读取的流成员函数,忽略逗号并在列表末尾停止的东西。我该怎么做?
-
您不断地通过创建和销毁新字符串来修改流。你不需要这样做。请参阅下面的代码进行演示。
标签: c++ timeout stringstream sstream