2017-01-25 16 views
1

Использование stringstream для извлечения слов из предложения.Почему std :: cout добавляет возврат или новые строки в мой вывод?

Для каждого слова добавляется новая строка, и я не могу понять, почему; ты можешь? Thx за вашу помощь. Keith: ^)

#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 
#include <algorithm> 

int main() { 
    int wordCount(9); 
    std::vector<std::string> v(wordCount); 
    std::vector<std::string>::iterator it; 
    std::string tStr; 
    std::string myStr = "the quick fox jumped over the lazy brown dogs"; 
    std::stringstream ss(myStr); 
    std::cout << "Sentence broken into vector:" << std::endl; 
    for (int i=0; i<wordCount; ++i) { 
     ss >> tStr; 
     v.push_back(tStr); 
    } 
    for (it=v.begin(); it != v.end(); ++it) 
     std::cout << *it << std::endl; 

    std::cout << std::endl; 
    return 0; 
} 

Компиляция, запуск и выход. Обратите внимание на дополнительные строки новой строки.

pickledEgg $ g++ -std=c++11 -g -Og -o io2 io2.cpp 
pickledEgg $ ./io2 
Sentence broken into vector: 









the 
quick 
fox 
jumped 
over 
the 
lazy 
brown 
dogs 
+3

Это будет отличное время для использования отладчика. – chris

+0

Вы не используете 'std :: cin' в любом месте этого кода ... – qxz

+1

вы создали вектор с 9 пустыми строками, а затем вы нажимаете остальные строки на конец ... вывод точно соответствует этому –

ответ

6

Когда вы создали свой вектор с этой линией std::vector<std::string> v(wordCount); вы создали wordCount пустые записи. Когда вы вызывали push_back, чтобы добавить свои слова, вы добавили свои слова в конце вашего вектора. Когда вы повторили свой вектор, вы сначала напечатали пустые записи новыми строками, а затем ваши хорошие данные.

+0

Да! Спасибо. Хороший глаз; длинный день для меня. – kmiklas

+0

@kmiklas Это было свежо в моей памяти из-за другого вопроса, иначе я бы, вероятно, пропустил его. –

4

довольно просто:

//std::vector<std::string> v(wordCount); 
std::vector<std::string> v; 

Я думаю, что вы хотите использовать std::vector::reserve.

Элементы хранятся смежно, что означает, что элементы могут быть доступны не только через итераторы, но и с помощью коррекций на регулярных указателей на элементы. Это означает, что указатель на элемент вектора может быть передан любой функции, которая ожидает указатель на элемент массива. http://en.cppreference.com/w/cpp/container/vector

Поскольку std::vector::push_back добавляет значение в вектор, вызывая изменение его размера. Если вы имеете дело с вектором достаточно большого размера, вы должны рассмотреть возможность использования std::vector::reserve.

Вы можете увидеть разницу в .

+1

Было уже слишком поздно;) – 0Tech

+0

Вы можете расширить ответ и объяснить, что происходит точно, так что никогда не поздно. – vsoftco

 Смежные вопросы

  • Нет связанных вопросов^_^