2012-07-16 38 views
5

Tôi muốn xác định một cái gì đó giống nhưCharacter Array như một giá trị trong C++ đồ

Map<int, char[5] > myMap; 

Việc kê khai trên được chấp nhận bởi C++ biên dịch và không có lỗi được ném nhưng khi tôi làm điều gì đó như thế này

int main() 
{ 
    char arr[5] ="sdf"; 
    map <int, char[5]> myMap; 
    myMap.insert(pair<int, char[5]>(0,arr)); 
    return 0; 
} 

tôi nhận được lỗi như:

In file included from /usr/include/c++/4.6/bits/stl_algobase.h:65:0, 
       from /usr/include/c++/4.6/bits/char_traits.h:41, 
       from /usr/include/c++/4.6/ios:41, 
       from /usr/include/c++/4.6/ostream:40, 
       from /usr/include/c++/4.6/iostream:40, 
       from charMap.cpp:1: 
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const _T1&, const _T2&) [with _T1 = int, _T2 = char [5]]’: 
charMap.cpp:9:42: instantiated from here 
/usr/include/c++/4.6/bits/stl_pair.h:104:31: error: array used as initializer 
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = int, _U2 = char [5], _T1 = const int, _T2 = char [5]]’: 
charMap.cpp:9:43: instantiated from here 
/usr/include/c++/4.6/bits/stl_pair.h:109:39: error: array used as initializer 

Điều quan trọng là đối với tôi để xác định một mảng nhân vật kích thước cố định becau nó sẽ tối ưu hóa hoạt động của luồng mạng của tôi. Có cách nào để đạt được nó? Tôi không muốn sử dụng char * hoặc std::string.

+1

bạn đã cố gắng xác định một 'struct' có chứa a 'char [5]'? – OmnipotentEntity

+0

Tại sao không 'char *' hoặc tốt hơn nhưng 'chuỗi'? –

+0

@OmnipotentEntity, có tôi đã có thể làm điều đó bằng cách làm cho nó một cấu trúc :) Nhưng bạn có thể vui lòng giải thích cho tôi lý do tại sao đã làm cho nó một công việc struct và không phải char [5] chính nó? –

Trả lời

2

Một cách là bọc mảng ký tự có kích thước cố định làm cấu trúc.

struct FiveChar 
{ 
    FiveChar(char in[5]) { memcpy(data, in, 5); } 
    char& operator[](unsigned int idx) { return data[idx]; } 
    char data[5]; 
}; 

int main(void) 
{ 
    char arr[5] = "sdf"; 
    map<int, FiveChar> myMap; 
    myMap.insert(pair<int, FiveChar>(0, arr)); 
    return 0; 
} 
+2

Về cơ bản, bạn đang triển khai lại phiên bản std/boost đơn giản hơn. Giải pháp này có thể hữu ích nếu OP không có quyền truy cập vào C++ 11 cũng không tăng, nếu không thì không cần phải tái tạo lại bánh xe. – betabandido

+0

Làm cách nào để truy xuất dữ liệu? Tôi đã sử dụng printf ("% s \ n", myMap [0] .data), nhưng nó không hoạt động. – user3658306

+0

@ user3658306 http://ideone.com/RiyDEb – timrau

7

Tôi hiểu các yêu cầu về hiệu suất của bạn (vì tôi cũng làm những việc tương tự), nhưng việc sử dụng các mảng ký tự theo cách đó khá là không an toàn.

Nếu bạn có quyền truy cập C++ 11, bạn có thể sử dụng std::array. Sau đó, bạn có thể xác định bản đồ của bạn như:

map <int, array<char, 5>> myMap; 

Nếu bạn không thể sử dụng C++ 11, sau đó bạn có thể sử dụng boost::array.

+0

Xin lỗi, tôi không thể sử dụng thư viện tăng cường –

+2

Hai '>' phải được phân tách bằng ký tự khoảng trắng.Nếu không, nó được coi là 'toán tử >>'. – timrau

+7

@timrau Không còn trong C++ 11. Hãy xem [tại đây] (http://en.wikipedia.org/wiki/C%2B%2B11#Right_angle_bracket). – betabandido

-2

Theo cặp documentation có thể chứa (và được xác định cho) các lớp riêng biệt. C mảng không phải là một lớp, mà là một cấu trúc. Bạn phải xác định lớp của riêng mình với quá tải operator[](). Có thể cần các toán tử so sánh cũng như

+2

Bạn chỉ cần thực hiện so sánh trên 'key_type', không phải' mapped_type' –

+0

Có, trong trường hợp của tôi, tôi cần mảng char cho loại ánh xạ, do đó chỉ đơn giản bằng cách tạo nó là một cấu trúc, nó làm việc cho tôi. tyepdef struct { char arr [5]; } fixedArray; Cấu trúc trên hoạt động cho tôi. –

1

Bạn không thể sử dụng một mảng trong vùng chứa tiêu chuẩn.

  1. Sử dụng một std::vector thay vì một mảng

  2. Sử dụng bản đồ về con trỏ đến mảng của 5 yếu tố.

  3. Sử dụng boost tuples thay vì mảng gồm 5 phần tử.

  4. Thay vì sử dụng mảng tạo struct mới có 3 yếu tố. Thực hiện map<int, newstructtype>. Hoặc bọc mảng của bạn trong một struct và điều đó cũng sẽ hoạt động.

\

struct ArrayMap 
{ 
    int color[5]; 
}; 

/

+0

+1 Đồng thời thêm bản đồ > để hoàn thành bản đồ. – Hindol

Các vấn đề liên quan