Как преобразовать std :: vector <unsigned char> в vector <char> без копирования?
Я не смог найти этот вопрос, и это актуальная проблема, с которой я сталкиваюсь.
У меня есть утилита загрузки файлов, которая возвращаетstd::vector<unsigned char>
содержащий все содержимое файла. Однако функция обработки требует массива смежныхchar
(и этоне можешь быть изменено - это функция библиотеки). Так как класс, использующий функцию обработки, в любом случае сохраняет копию данных, я хочу сохранить ее какvector<char>
, Вот код, который может быть немного более иллюстративным.
std::vector<unsigned char> LoadFile (std::string const& path);
class Processor {
std::vector<char> cache;
void _dataOperation(std::vector<char> const& data);
public:
void Process() {
if (cache.empty())
// here's the problem!
cache = LoadFile("file.txt");
_dataOperation(cache);
}
};
Этот код не компилируется, потому что (очевидно) нет подходящего преобразования. Однако мы можем быть уверены, что временный вектор будет занимать такой же объем памяти (IOWsizeof(char) == sizeof(unsigned char)
)
Наивным решением было бы перебрать содержимое временного и разыграть каждого персонажа. Я знаю, что в нормальном случаеoperator= (T&&)
будет называться.
В моей ситуации безопасно переосмысливать преобразование, потому что я уверен, что буду читать только символы ASCII. Любой другой персонаж будет пойман в_dataOperation
так или иначе.
Итак, мой вопрос:Как правильно и безопасно преобразовать временный вектор так, чтобы не было копирования?
Если это невозможно, я бы предпочел безопасный способ копирования, а не небезопасное копирование. Я также мог бы изменитьLoadFile
вернуть либоvector<char>
или жеvector<unsigned char>
.