Использование строкового потока для чтения целых чисел и их сложения - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь использовать строковый поток для вывода суммы целых чисел в каждой строке стандартного ввода с использованием строкового потока. Это то, что у меня есть

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);
    }

}

Я хочу, чтобы каждая строка имела свою собственную сумму. Но когда я это делаю, на вывод ничего не возвращается. Любая помощь будет оценена по достоинству.

1 Ответ

0 голосов
/ 18 июня 2020

sstream пуст, когда вы используете его во втором while: while (sstream >> i). Это потому, что вы инициализировали его пустым std::string line;. Вы можете переместить его внутрь первого, пока l oop:

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

Это исправит ваш код.

Некоторые предложения по улучшению вашего кода:

Кроме того, всегда инициализируйте свои переменные, поэтому int i должно быть int i = 0; или int i{};.

Кажется, вы просто читаете из стандартного ввода в line, а затем конвертируете его в int. Вы можете использовать std::stoi() вместо stringstream, что может быть достаточно в этом случае.

sumvec содержит необработанный l oop для добавления всех элементов vector. Вместо этого вы можете использовать std::accumulate. Пример:

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

Если вы все еще хотите использовать sumvec, убедитесь, что вы передаете вектор по ссылке. Это позволит избежать копирования, что приведет к повышению производительности, и у вас будет гарантия, что v не изменится в этой функции. Это также дает читателю понять, что делает эта функция.

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

Кроме того, в вашем l oop

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

Вы сравниваете size_t с int. size_t соответствует unsigned, а int - нет. По возможности избегайте этого. Вместо этого используйте size_t:

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