Можно ли в C ++ передавать буфер другого типа между объектами std :: vector несовместимых типов - PullRequest
3 голосов
/ 12 мая 2019

У меня есть два вектора std::vector<Type1> и std::vector<Type2> с двумя разными несовместимыми типами Type1 и Type2 связанных размеров (например, sizeof(Type1)==2*sizeof(Type2)).

Я хотел бы выполнитьswap() операция, точно так же, как std::vector::swap(), но между векторами с несовместимыми типами.

Причина: производительность.Я не хочу тратить время на копирование данных только потому, что типы номинально различаются, когда я знаю, что они де-факто совместимы как массивы.

Какой самый хороший способ в C ++ это сделать?

(Пожалуйста, не говорите мне, что мне нужно каким-то образом примирить Type1 и Type2 в один тип, я действительно не могу сделать это по причинам, выходящим за рамки этого вопроса.)

Образец:

  std::vector<Type1> vec1 = getVec1(); // this returns the vector of Type1
  std::vector<Type2> *vec2 = needThisFunctionThatCreatesVec2WithTheSameBuffer(&vec1); // ????? looking for 
  consumeVec2(vec2); // this consumes vec2

1 Ответ

1 голос
/ 12 мая 2019

std::vector не поддерживает такую ​​функцию.

Я бы порекомендовал слегка грязный обходной путь, создав искусственный std::span<Type2>, и пусть функция ConsumeVec2 потребляет span вместо vector.

Я знаю std::span в стандарте еще нет, но не составляет труда написать быструю замену необходимой вам функциональности (при условии, что вам нужны только простые вещи), или вы можете использовать boost::span (извините, не проверял, надеюськто-нибудь может это проверить).

По сути, класс span является средством просмотра - это не контейнер, а ссылка на существующий - он содержит указатели begin и end и допускает векторную функциональностькроме изменения размера исходного вектора и / или перераспределения данных.

Вам необходимо изменить интерфейс функции ConsumeVec2, чтобы она принимала span.И это не будет работать, если функция изменяет размер вектора.Поэтому я не совсем уверен, решит ли это вашу проблему.

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