2009-10-16 27 views
5

Tôi muốn chuyển đổi chuỗi kiểu C thành byte-vector. Giải pháp làm việc sẽ chuyển đổi từng ký tự theo cách thủ công và đẩy nó lên vectơ. Tuy nhiên, tôi không hài lòng với giải pháp này và muốn tìm một cách thanh lịch hơn.Chuyển đổi chuỗi C thành tiêu chuẩn :: vector <byte> theo cách hiệu quả

Một trong những nỗ lực của tôi là như sau:

std::vector<byte> myVector; 
&myVector[0] = (byte)"MyString"; 

mà lỗi và trở nên tôi một

lỗi C2106: '=': toán hạng trái phải l-giá trị

Cách chính xác để làm điều này là gì?

Trả lời

8

Điều cơ bản nhất sẽ là một cái gì đó như:

const char *cstr = "bla" 
std::vector<char> vec(cstr, cstr + strlen(cstr)); 

Tất nhiên, không tính toán chiều dài nếu bạn biết điều đó.

Giải pháp phổ biến hơn là sử dụng lớp std::string:

const char *cstr; 
std::string str = cstr; 
+1

phải sử dụng lệnh std :: vetor để lưu trữ ở định dạng nhị phân. – Etan

0
std::vector<byte> myVector; 
const char* str = "MyString"; 
myVector.assign(str, str+strlen(str)); 
0

Câu hỏi rõ ràng nhất sẽ là lý do tại sao bạn không chỉ cần sử dụng std :: string:

std::string myString("MyString"); 

nhưng nếu bạn thực sự nghĩ mình cần một véc tơ:

char myString[] = "MyString"; 

std::vector<byte> myVector(myString, myString+sizeof(myString)); 

Bạn cũng có thể muốn xem xét sử dụng std :: tr1 :: mảng:

std::tr1::array<byte, sizeof("MyString")> myArray = {"MyString"}; 

C++ 0x cũng sẽ có std::array.

+0

Một câu hỏi rõ ràng hơn với tôi là: anh ta lấy mảng char ở đâu từ đầu (trừ khi một số hàm thư viện phân bổ và trả về nó)? – UncleBens

5

Vùng chứa STL chẳng hạn như vectorluôn là có quyền sở hữu, nghĩa là họ quản lý bộ nhớ của riêng mình. Bạn không thể sửa đổi bộ nhớ được quản lý nội bộ bởi một vùng chứa STL. Vì lý do đó, nỗ lực của bạn (và bất kỳ nỗ lực tương tự) là cam chịu thất bại.

Giải pháp hợp lệ duy nhất là sao chép bộ nhớ hoặc viết vùng chứa kiểu STL mới không chiếm quyền sở hữu bộ nhớ mà nó truy cập.

+1

Bạn không thể buộc một container STL sử dụng dung lượng lưu trữ mà bạn đã cấp, không.Nhưng bạn *** có thể * sửa đổi ** lưu trữ của container thông qua 'vector :: resize()' hoặc 'vector :: reserve()' :) – Unsigned

+0

điều gì về allocator_traits? tức là nếu bạn tạo một allocator_traits tùy chỉnh và gán cho một vectơ? – kvr

+0

@Konrad Rudolph - Tôi có tình huống tương tự trong đó tôi nhận được một số chuỗi phong cách C từ argv (cách nhau bằng dấu cách) và tôi muốn "nối" chúng thành một vector đơn , tức là - cho đầu vào: ./MyExe AA BB CC DD - Tôi muốn có véc tơ vec như sau: vec = {A, A, B, B, C, C, D, D}. Tại thời điểm mã của tôi, đầu tiên, xây dựng một chuỗi std :: từ các chuỗi đầu vào đã cho và chuyển đổi nó thành một vector (xem bên dưới). Có cách nào hiệu quả hơn để làm điều đó không? int main (int argc, char ** argv) { chuỗi đầu vàoStr; cho (int i = 1; i

0

cái gì đó dọc những dòng này nên làm việc

std::vector<byte> myVector = std::vector((byte*)cstring, (byte*)ctring + strlen(cstring)) 

Ngoài ra, đây vẫn sẽ chỉ lặp qua chuỗi c và chèn giá trị vào các vector. Giống như Konrad nói, đó chỉ là cách bạn phải làm điều đó vì các vectơ quản lý bộ nhớ của riêng họ.

-2
const char *cstr = "bla" 
std::vector<char> vec; 
vec.resize(strlen(cstr)+1); 
strcpy(&vec[0],cstr); 
Các vấn đề liên quan