копирование одного символа с использованием std :: copy - PullRequest
0 голосов
/ 22 июня 2011

Я пытаюсь использовать std::copy для копирования из двух разных итераторов.Но в ходе выполнения эти два итератора могут указывать на одно и то же местоположение.Почему в этой ситуации они не копируют отдельные символы.

std::string str1 = "ABC";
std::string::iterator itr1 = str1.begin();
std::string::iterator itr2 = str1.begin();
std::string result;
std::copy(itr1,itr2,result.begin());

Ответы [ 4 ]

7 голосов
/ 22 июня 2011

Правая граница диапазона в STL не включена. Если вы дадите ему один и тот же итератор дважды, результатом будет пустой диапазон. Вы хотите это:

std::copy(itr1,itr2+1,result.begin());

Но тогда имейте в виду, что вы пишете в местоположение без зарезервированной памяти, что является неопределенным поведением. Вы должны использовать back_insert_iterator

std::copy(itr1,itr2 + 1, std::back_inserter(result));
2 голосов
/ 22 июня 2011

Запись:

result.resize(1); //it must have some size
std::copy(itr1,itr2 + 1,result.begin());

Или еще лучше.

//no need to resize now!
std::copy(itr1,itr2 + N, std::back_inserter(result));

, где N - количество символов, которое вы хотите скопировать в result.

1 голос
/ 22 июня 2011

В вашей ситуации вы можете просто сделать:

std::string result(itr1, itr1 + 1);

Поскольку std::string имеет конструктор , для копирования которого требуется два итератора.

Теперь для объяснений:

std::copy(itr1, itr2, res) копирует все элементы, начиная с itr1 и заканчивая непосредственно перед itr2 a местоположением, указанным res.

То есть, если itr1 == itr2 между двумя итераторами нет "пробела" и ничего не копируется.

Именно поэтому итератор end() обычно указывает за последним элементом коллекции.


Рассмотрим следующий вектор, vec, который имеет 3 элемента:

1, 2, 3, X
^        ^
|        | 
|        \-- end() (X indicates a slot past the last element)
\----------- begin()

То есть, если вы используете std::copy() с begin() и end(), вы фактически скопируете все элементы vec.

0 голосов
/ 22 июня 2011

Второй параметр copy() - это элемент после последнего скопированного;str1.end() будет указывать после последнего символа, а не перед ним.Ваш звонок просит о копировании 0 символа, и это то, что вы получаете.Вы можете продвинуться itr2 на единицу до совершения звонка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...