Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> скопировать кусок вектора в другой 
V
    Опции темы
semibug
Дата 24.6.2011, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Простите если было, поиском не нашел.
Как половчее скопировать часть одного вектора, допустим элементы с 10-го по 20-й в новый вектор?
Цикл не предлагать  smile 
PM   Вверх
azesmcar
Дата 24.6.2011, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



PM   Вверх
semibug
Дата 24.6.2011, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Цитата(azesmcar @  24.6.2011,  13:28 Найти цитируемый пост)
std::copy 

затрудняюсь в выборе параметров, например беру итератор через begin, чтобы указать 10-й элемент, можно просто дописать +10 ?

Добавлено @ 13:42
вот так православно будет?:

Код

std::vector<int> src;
...
std::vector<int> part( src.at( 10 ), src.at( 20 ) );





Это сообщение отредактировал(а) semibug - 24.6.2011, 13:42
PM   Вверх
triclosan
Дата 24.6.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Код

std::vector<int> part( src.begin()+10, src.begin()+20 );

Итераторы же
PM MAIL   Вверх
semibug
Дата 24.6.2011, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



ну точно, src.at( 10 ), src.at( 20 ) трактуется как два числа, соответственно получаем массив из 10-ти элементов со значением 20, значит буду отталкиваться от begin. Не пользовался раньше итераторами, не был уверен, что можно операцией сложения смещать его.
Спасибо!

PM   Вверх
borisbn
Дата 24.6.2011, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(semibug @  24.6.2011,  13:49 Найти цитируемый пост)
соответственно получаем массив из 10-ти элементов со значением 20

получаем массив из src[10] элементов, проинициализированных значением src[20] smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
triclosan
Дата 24.6.2011, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Цитата(semibug @  24.6.2011,  13:49 Найти цитируемый пост)
Не пользовался раньше итераторами, не был уверен, что можно операцией сложения смещать его.

Вот матчасть по этому вопросу http://www.cplusplus.com/reference/std/iterator/
PM MAIL   Вверх
azesmcar
Дата 24.6.2011, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(semibug @  24.6.2011,  13:29 Найти цитируемый пост)
затрудняюсь в выборе параметров, например беру итератор через begin, чтобы указать 10-й элемент, можно просто дописать +10 ?

да
Код

std::copy(vec.begin() + 10, vec.end(), std::back_inserter(another_vec));

как- то так.
PM   Вверх
semibug
Дата 24.6.2011, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Цитата(borisbn @  24.6.2011,  13:51 Найти цитируемый пост)

получаем массив из src[10] элементов, проинициализированных значением src[20]

верно, поспешил с выводом (набросал примерчик, где инициализировал исходный вектор циклом, значения и индексы совпадали, не подумав ляпнул)

Усе понятно, вопрос закрыт.
thx2all!
PM   Вверх
Сыроежка
Дата 24.6.2011, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(semibug @  24.6.2011,  13:27 Найти цитируемый пост)
Простите если было, поиском не нашел.
Как половчее скопировать часть одного вектора, допустим элементы с 10-го по 20-й в новый вектор?
Цикл не предлагать    

Как уже здесь было сказано, можно использовать для этих целей стандартный алгоритм 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.
PM MAIL   Вверх
Сыроежка
Дата 26.6.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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) );


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1411 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.