Size: a a a

2021 July 15

DP

Denis Paukaev in supapro.cxx
А не необходимость
источник

͏С

͏ СаС in supapro.cxx
если мне надо из vector1 переместить несколько (что важно, не все) элементов в vector2, при этом удалив их из vector1 - какой оптимальный алгоритм?
я пока что пришел к
итерируюсь от begin() до end() -> в случае перемещения элемента (то есть, удаления с оригинального вектора) делаю --it, в следствии чего ++it после тела цикла вернет его на место
только вопрос, вычисляется ли заново в каждой итерации end() в случае смены размера вектора (чтоб он не вышел на невалидный адрес)
upd: последний вопрос про end() снят, увидел пример на цппрефе
источник

s

std::slavik in supapro.cxx
ну я вот вчера использовал  для такой задачи
есть такой вот типа код - MCInst - базовый тип для эмиссии машинного кода - в нем по сути содержатся байты без всякой доп информации
std::unique_ptr<MCInst> ins;

ins = emitter.emit(*ctr);

но для некоторых операций есть аппаратные ограничения которые неплохо бы проверять, они(если есть) добавляются в класс - наследник  MCInst и в валидаторе мы пробуем сделать каст к этому классу - и если он получается - проверяем для него рестрикшены
if (not Validator::validate(ins))
{
  return false;
}
источник

DP

Denis Paukaev in supapro.cxx
Почему в базовый класс не вынести функцию просто? Либо сделать базовый класс "операция с ограничениями", насладник вашего супер общего класса
источник

s

std::slavik in supapro.cxx
разделение ответственности
источник

IZ

Ilia Zviagin in supapro.cxx
Скопировать элементы в новый вектор, удалить из старого, ВСЁ.
источник

s

std::slavik in supapro.cxx
нижним уровням не нужно знать ни про какие рестрикшены
источник

s

std::slavik in supapro.cxx
им нужен массив байтов
источник

DP

Denis Paukaev in supapro.cxx
Да, потому я думаю что операции с ограничениями это другой базовый класс
источник

DP

Denis Paukaev in supapro.cxx
У которого уже есть нужное апи
источник

DP

Denis Paukaev in supapro.cxx
И даункасты пропали )
источник

s

std::slavik in supapro.cxx
только теперь мы должны под 2 типа весь код переписать
источник

s

std::slavik in supapro.cxx
операции с ограничениями  и без
источник

DP

Denis Paukaev in supapro.cxx
Один наследник другого
источник

DP

Denis Paukaev in supapro.cxx
Что значит переписать
источник

s

std::slavik in supapro.cxx
так так и сделано
источник

s

std::slavik in supapro.cxx
просто по дезигну - emit возвращает std::unique_ptr<MCInst>
источник

DP

Denis Paukaev in supapro.cxx
Кому надо знать про рестрикшены принимает класс базовый с рестрикшенами
источник

s

std::slavik in supapro.cxx
emit для каждой операции свою перегрузку имеет
источник

s

std::slavik in supapro.cxx
и для тех кому надо - мы внутри emit создаем MCInstRestrictions : MCInst
и возвращаем std::unique_ptr<MCInst>
источник