|
Модераторы: bsa |
|
semibug |
|
|||
Опытный Профиль Группа: Участник Сообщений: 323 Регистрация: 27.3.2009 Репутация: нет Всего: нет |
Простите если было, поиском не нашел.
Как половчее скопировать часть одного вектора, допустим элементы с 10-го по 20-й в новый вектор? Цикл не предлагать |
|||
|
||||
azesmcar |
|
|||
uploading... Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
semibug |
|
|||
Опытный Профиль Группа: Участник Сообщений: 323 Регистрация: 27.3.2009 Репутация: нет Всего: нет |
затрудняюсь в выборе параметров, например беру итератор через begin, чтобы указать 10-й элемент, можно просто дописать +10 ? Добавлено @ 13:42 вот так православно будет?:
Это сообщение отредактировал(а) semibug - 24.6.2011, 13:42 |
|||
|
||||
triclosan |
|
|||
Опытный Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
Итераторы же |
|||
|
||||
semibug |
|
|||
Опытный Профиль Группа: Участник Сообщений: 323 Регистрация: 27.3.2009 Репутация: нет Всего: нет |
ну точно, src.at( 10 ), src.at( 20 ) трактуется как два числа, соответственно получаем массив из 10-ти элементов со значением 20, значит буду отталкиваться от begin. Не пользовался раньше итераторами, не был уверен, что можно операцией сложения смещать его.
Спасибо! |
|||
|
||||
borisbn |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
получаем массив из src[10] элементов, проинициализированных значением src[20] -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
triclosan |
|
|||
Опытный Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
Вот матчасть по этому вопросу http://www.cplusplus.com/reference/std/iterator/ |
|||
|
||||
azesmcar |
|
|||
uploading... Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
semibug |
|
|||
Опытный Профиль Группа: Участник Сообщений: 323 Регистрация: 27.3.2009 Репутация: нет Всего: нет |
||||
|
||||
Сыроежка |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Как уже здесь было сказано, можно использовать для этих целей стандартный алгоритм std::copy. Я бы хотел сделать некоторые замечания. Если хотите, чтобы ваш код был бы более переносимым, то не используйте операцию сложения итератора с целым числом. Это верно только для итераторов произвольного доступа. Лучше использовать функцию std::advance. Для итераторов произвольного доступа она инстанциируется в простое сложение итератора с целым числом. Но зато если вы захотите поменять контейнер, например, с вектора на список, то алгоритм с std::advance будет по-прежнему работать в отличии от использования сложения итератора с целым числом. Пример выражения для алгоритма copy std::copy( std::advance( v.begin(), 9 ), std::advance( v.begin(), 19 ), std::back_inserter( OtherVector) ); Кроме того, не ясно, куда именно во второй вектор или контейнер вы хотите скопировать элементы: либо в начало контейнера, либо в конец, либо вы хотите переписать элементы второго контейнера, либо вставить во второй контейнер элементы первого контейнера. От этого будет зависеть тип третьего операнда. Я показал пример, когда новые элементы будут добавляться в конец второго контейнера. В-третьих, не бойтесь писать собственные алгоритмы, так как стандартные алгоритмы крайне ограничены и их система не полная. Например, по вине Страуструпа был исключен алгоритм copy_if, о чем теперь сам Страуструп очень жалеет. Я, например, когда мне известно число элементов, которые нужно скопировать, использую собственный алгоритм copy_n. Его объявление следующее template <typename ForwardIterator, typename OutputIterator, typename Size> OutputIterator copy_n( ForwardIterator first, OutputIterator result, Size n ); Он напоминает фуекцию для строк strncpy. |
|||
|
||||
Сыроежка |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Тут меня никто не поправил, а дело в том, то функция advance имеет возвращаемое значение void. Поэтому как я написал вызов алгоритма является неверным.
Функции advance передается ссылка на итератор, поэтому нужно объявить итераторs отдельно. Например std::vector<int>::iterator first = v.begin(), last = v.begin(); advance( first, 9 ); advance( last, 19 ); std::copy( first, last, std::back_inserter( OtherVector) ); |
|||
|
||||
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |