stl copy c++ проблема копирования


1

Проблема при копировании с помощью copy() Объявление:

copy(it, it, back_inserter(sell_medic));

Где it:

list<Medicine>::iterator it = medic.begin();
advance(it, id - 1);

Метод вообще не копирует в нужный list <Medicine> sell_medic;

Источник
  •  248
  •  2
  • 18 янв 2019 2019-01-18 19:38:18
Почему вы откатили правку, уточняющую заголовок вопроса? Сейчас ваш заголовок состоит из 3 используемых меток и предложения "проблема копирования", которое носит крайне общий характер. Человеку, который столкнулся с подобной проблемой, по текущему заголовку будет сложно найти ваш вопрос — 19 янв 20192019-01-19 12:30:17.000000
sell_medic.push_back(*it) и все дела — 17 янв 20192019-01-17 20:35:59.000000
Что именно вы хотели скопировать? Что значит it, it? — 17 янв 20192019-01-17 20:26:33.000000

2 ответа

1

Если вам так уж хочется использовать стандартный алгоритм, то можно так:

copy_n(it, 1, back_inserter(sell_medic));
4

В алгоритмах стандартной библиотеки пара итераторов представляет диапазон - [begin, end[ (end указывает на элемент за последним), поэтому диапазон it, it будет всегда представлять пустое множество. Если вы хотели скопировать с начала до it (но не включая элемент, на который it указывает) то код должен быть:

copy(medic.begin(), it, back_inserter(sell_medic));

А если мне надо скопировать конкретный элемент, на который указывает этот итератор?

Тогда вам вообще не нужен std::copy:

sell_medic.push_back( *it );

но если сильно хочется:

std::copy(it, std::next(it), std::back_inserter(sell_medic));

ЗЫ этот код излишне многословен:

list<Medicine>::iterator it = medic.begin();
advance(it, id - 1);

проще написать так:

auto it = std::next( medic.begin(), id - 1 );

так и проще читать и короче std::next()

  • 17 янв 2019 2019-01-17 20:56:42
@RiotBr3aker но такая арифметика с итераторами list не работает, я понял свою ошибку, я просто создал другой итератор и сделал диапазон в один элемент. А copy я использую, потому, что list из объектов класса Medicine и содержит несколько полей, поэтому мне так удобней копировать — 17 янв 20192019-01-17 20:38:06.000000
@ARHovsepyan, там как минимум есть advance(it, id - 1);. — 17 янв 20192019-01-17 20:33:16.000000
std::copy(it, it + 1, back_inserter(sell_medic)); но если вам всегда нужно копировать только один элемент в контейнер - не совсем понятно, зачем вам std::copy. — 17 янв 20192019-01-17 20:29:46.000000
А если мне надо скопировать конкретный элемент, на который указывает этот итератор? — 17 янв 20192019-01-17 20:27:54.000000