Существует множество способов чтения текста из стандартного ввода в std::string
. Что касается std::string
s, то они растут по мере необходимости, что, в свою очередь, означает, что они перераспределяются. Внутренне std::string
имеет указатель на буфер фиксированной длины. Когда буфер заполнен и вы запрашиваете добавить один или несколько символов на него, объект std::string
создаст новый больший буфер вместо старого и переместит весь текст в новый буфер.
Все это говорит о том, что если вы знаете длину текста, который вы собираетесь прочитать заранее, то вы можете улучшить производительность, избегая этих перераспределений.
#include <iostream>
#include <string>
#include <streambuf>
using namespace std;
// ...
// if you don't know the length of string ahead of time:
string in(istreambuf_iterator<char>(cin), istreambuf_iterator<char>());
// if you do know the length of string:
in.reserve(TEXT_LENGTH);
in.assign(istreambuf_iterator<char>(cin), istreambuf_iterator<char>());
// alternatively (include <algorithm> for this):
copy(istreambuf_iterator<char>(cin), istreambuf_iterator<char>(),
back_inserter(in));
Все вышеперечисленное скопирует весь текст, найденный в stdin, до конца файла. Если вам нужна только одна строка, используйте std::getline()
:
#include <string>
#include <iostream>
// ...
string in;
while( getline(cin, in) ) {
// ...
}
Если вам нужен один символ, используйте std::istream::get()
:
#include <iostream>
// ...
char ch;
while( cin.get(ch) ) {
// ...
}