使用字符串流读取整数并将它们相加

Using stringstream to read integers and add them up

本文关键字:整数 字符串 读取      更新时间:2023-10-16

我正在尝试使用字符串流使用字符串流输出标准输入的每一行中的整数总和。这就是我到目前为止所拥有的

void sumvec(vector<int> v) {
int total = 0;
for (int i = 0; i < v.size(); i++) {
total += v[i];
}
cout << total << endl;
}
int main()
{
std::vector<int> v;
std::string line;
std::stringstream sstream(line); 
int i;
while (getline(std::cin, line)){
while (sstream >> i) { 
v.push_back(i); 
}
sumvec(v);
}
}

我希望每行都有自己的总和。但是当我这样做时,没有任何内容被返回到输出。任何帮助将不胜感激。

当您在第二个while中使用它时sstream为空:while (sstream >> i)。那是因为您使用空std::string line;初始化了它。您可以在第一个 while 循环中移动它:

while (getline(std::cin, line)){
std::stringstream sstream(line);

这将修复您的代码。

改进代码的一些建议:

此外,请始终初始化变量,因此int iint i = 0;int i{};

似乎您只是从 stdin 读取到line,然后将其转换为int.您可以使用std::stoi()代替stringstream,在这种情况下可能就足够了。

sumvec包含一个原始循环,用于添加vector的所有元素。您可以改用std::accumulate来执行此操作。例:

int total = std::accumulate(v.begin(), v.end(), 0);
cout << total << endl;

如果您仍想使用sumvec,请确保通过引用传递向量。这将避免复制,从而提高性能,并且您将保证v不会更改此功能。它还使读者清楚地知道这个函数的作用。

void sumvec(const vector<int>& v) {

此外,在您的循环中

for (int i = 0; i < v.size(); i++)

您正在将size_tint进行比较.size_tunsigned,而int则不是。尽可能避免这种情况。请改用size_t

for (size_t i = 0; i < v.size(); i++)