Tôi không thể tìm thấy câu hỏi đó và đó là vấn đề thực tế mà tôi đang gặp phải.Làm thế nào để chuyển đổi std :: vector <unsigned char> thành vector <char> mà không cần sao chép?
Tôi có tiện ích tải tệp trả về std::vector<unsigned char>
chứa toàn bộ nội dung tệp. Tuy nhiên, chức năng xử lý yêu cầu mảng contiguos là char
(và không thể thay đổi - đó là chức năng thư viện). Vì lớp đang sử dụng hàm xử lý lưu trữ một bản sao của dữ liệu, tôi muốn lưu trữ nó như là vector<char>
. Đây là mã có thể minh họa hơn một chút.
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);
}
};
Mã này không biên dịch, vì (rõ ràng) không có chuyển đổi phù hợp. Tuy nhiên, chúng tôi có thể chắc chắn rằng vectơ tạm thời sẽ có cùng một lượng bộ nhớ (IOW sizeof(char) == sizeof(unsigned char)
)
Giải pháp ngây thơ sẽ lặp lại nội dung tạm thời và truyền mọi ký tự. Tôi biết rằng trong trường hợp bình thường, operator= (T&&)
sẽ được gọi.
Trong trường hợp của tôi, việc chuyển đổi lại thông tin trở nên an toàn, vì tôi chắc chắn tôi sẽ chỉ đọc các ký tự ASCII. Bất kỳ ký tự nào khác cũng sẽ bị bắt trong _dataOperation
.
Vì vậy, câu hỏi của tôi là: cách chuyển đổi vector tạm thời đúng cách và an toàn theo cách không liên quan đến việc sao chép?
Nếu không thể, tôi thích cách sao chép an toàn hơn là không an toàn. Tôi cũng có thể thay đổi LoadFile
để trả lại vector<char>
hoặc vector<unsigned char>
.
Nếu bạn kiểm soát mã của '_dataOperation', có thể bạn sẽ hạnh phúc hơn về lâu dài nếu bạn làm cho nó lấy' vector '. –
zwol
@Zack thật không may, tôi không. Đó là một chức năng thư viện. Tôi sẽ chỉnh sửa câu hỏi. –
Không có _safe_ way –