2012-01-22 39 views
5

tôi đã tạo ra một bản đồ của vectơ đó trông như thế này:C++ bản đồ <string, vector <char>> truy cập

map<string, vector<char> > myMap; 
string key = "myKey"; 
vector<char> myVector; 
myMap[key] = myVector; 

Tôi muốn để có thể nối thêm 'char' to vector trong bản đồ nhưng tôi không thể tìm ra cách truy cập vectơ đã nói để nối thêm khi khóa/giá trị (vector) cụ thể đã được tạo. Bất kỳ đề xuất? Tôi đang iterating trên char's và có thể được thêm rất nhiều vào các vector như tôi đi vì vậy nó sẽ được tốt đẹp để có một cách đơn giản để làm điều đó. Cảm ơn.


Tôi muốn vector trong bản đồ được nối thêm khi tôi sử dụng. Tôi không cần vector ban đầu ... Tôi chỉ cần trả về bản đồ của khóa/vector mà tôi đã tạo (sau khi chờ) để tôi có thể truyền nó sang một hàm khác. * Trong bản đồ *> làm gì? Đó có phải là điều chỉnh một con trỏ không? (Tôi chưa đến đó trong bài giảng) Ngoài ra, tôi có cần: myMap [key] -> push_back ('s'); hoặc myMap [key] .push_back ('s'); ??

+0

Bạn đang cố gắng tạo bảng băm? –

+0

Để rõ ràng - bạn có muốn gắn thêm vào 'myVector' hoặc bản sao của đối tượng đó được lưu trữ trên bản đồ không? Mir Milad Hosseiny đã trả lời như thể bạn muốn sử dụng bản đồ để nối thêm vào 'myVector', vì vậy câu trả lời đó có thể áp dụng được, hoặc tất cả những câu trả lời khác đều được áp dụng. –

Trả lời

7

Để thêm:

myMap[key].push_back('c'); 

Hoặc sử dụng myMap.find, nhưng sau đó bạn phải kiểm tra xem bạn có được một iterator end. operator[] trả về tham chiếu đến vector.

Nhưng điều này sửa đổi vector được lưu trữ trong map, không phải bản gốc vì bạn đã lưu bản sao trong map với myMap[key] = myVector;. Nếu đó không phải là những gì bạn muốn, bạn nên suy nghĩ lại thiết kế của bạn và có thể lưu trữ (thông minh) con trỏ đến vectơ trong bản đồ của bạn.

+1

Bằng cách này, một bản sao của vectơ được tạo ra và một bản sao được đẩy vào nhân bản và vector gốc là trống. –

+0

@MirMiladHosseiny: ok, bây giờ tôi hiểu ý của bạn, nhưng tôi cho rằng OP sẽ sử dụng các vectơ được lưu trữ trong bản đồ chứ không phải bản gốc. –

+0

Cái gì ....? Vô lý!'myMap [key]' là một lvalue với 'std :: vector ' trong bản đồ. Biểu thức 'myMap [key] .push_back ('c');' là hoàn toàn ổn và cách để đi! (+1 trên câu trả lời). –

1

Để truy cập giá trị được ánh xạ, mà trong trường hợp của bạn là một vectơ, bạn chỉ cần cung cấp khóa trong dấu ngoặc vuông như bạn đã làm để gán giá trị. Vì vậy, để thêm 'a':

myMap[key].push_back('a'); 
+0

Bằng cách này, một bản sao của vectơ được tạo ra và 'a' được đẩy để nhân bản vector và vectơ gốc là trống. –

+0

Không. 'MyMap [key]' trả về một tham chiếu, do đó nó sửa đổi vectơ bên trong bản đồ. – Arpegius

+0

@lionbest - OP nói rằng anh ta muốn "chắp thêm 'char' vào vectơ trong bản đồ", vì vậy tôi tin điều này là đúng. –

3

đưa cho bạn biết phím:

string key = "something"; 
char ch = 'a'; // the character you want to append 

map<string, vector<char> >::iterator itr = myMap.find(key); 
if(itr != myMap.end()) 
{ 
    vector<char> &v = itr->second; 
    v.push_back(ch); 
} 

bạn cũng có thể sử dụng map::operator[] để truy cập vào bản đồ, nhưng nếu chìa khóa không tồn tại, một entry mới với chìa khóa đó sẽ được tạo:

vector<char> &v = myMap[key]; // a map entry will be created if key does not exist 
v.push_back(ch); 

hoặc đơn giản là:

myMap[key].push_back(ch); 
+0

Phải là 'vector & v'. Vì vậy, 'v.push_back (ch)' hoạt động trên điểm lặp nào. – Arpegius

+0

@Meysam: lionbest là chính xác: nếu bạn nhấn mạnh tham chiếu 'iter-> second' bằng tên khác (vd' v') bạn cần, hãy tham khảo: 'std :: vector & v = iter-> giây ; '. –

+0

@Meysam: ngay cả khi sử dụng toán tử chỉ số có thể tạo các phần tử mới khi chúng không tồn tại, bạn vẫn cần phải sử dụng tham chiếu: nếu không bạn sẽ thêm vào một bản sao. –

0

Tôi có đề xuất mới. Bạn có thể sử dụng vector<char>* thay vì vector<char> để thu thập con trỏ của vectơ trong map của mình. Để biết thêm thông tin, xem mã dưới đây:

map<string, vector<char>* > myMap; 
string key = "myKey"; 
vector<char>* myVector = new vector<char>(); 
myMap[key] = myVector; 
myMap[key]->push_back('S'); 
+3

Điều gì sẽ là lợi thế của việc sử dụng con trỏ tới 'std :: vector ' ngoài việc gần như chắc chắn tạo ra một rò rỉ bộ nhớ? –

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