2013-02-15 60 views
5

Tại sao tôi nhận được lỗi bên dưới khi truy cập các giá trị của cặp trong một trình lặp của một vectơ các cặp?Lỗi khi nhận giá trị từ Vector của các cặp

vector< pair<int,string> > mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (vector< pair<int,string> >::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << *it.first << " "   // <-- error! 
     << "2nd: " << *it.second << endl;  // <-- error! 
} 

Thông báo lỗi:

main_v10.cpp:165:25: error: ‘std::vector > >::iterator’ has no member named ‘first’ main_v10.cpp:165:56: error: ‘std::vector > >::iterator’ has no member named ‘second’

Làm thế nào tôi có thể sửa lỗi này?

+1

Bạn có thể muốn đọc ưu tiên toán tử, thanh toán '*' và '.' ưu tiên: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B – billz

Trả lời

7

Đây cũng là vấn đề áp dụng cho con trỏ (một trình lặp hoạt động khá giống con trỏ). Có hai cách để truy cập vào một thành viên của giá trị con trỏ (hoặc iterator) điểm:

it->first  // preferred syntax: access member of the pointed-to object 

hoặc

(*it).first // verbose syntax: dereference the pointer, access member on it 

Các ưu tiên toán tử biến biểu hiện của bạn vào

*(it.first) // wrong! tries to access a member of the pointer (iterator) itself 

mà cố gắng truy cập vào thành viên first trên bản thân trình lặp, không thành công, vì nó không có thành viên được gọi là first. Nếu nó đã làm, bạn sau đó dereference giá trị của thành viên đó.


Tuy nhiên, trong hầu hết các trường hợp như vậy, bạn nên sử dụng std::map để ánh xạ từ khóa đến giá trị. Thay vì vector<pair<int,string> >, bạn nên sử dụng map<int,string> mà ứng xử tương tự (chèn, lặp đi lặp lại và các công cụ cũng xảy ra với các cặp), nhưng nó sắp xếp các phím trong cấu trúc dữ liệu để truy cập nhanh hơn ngẫu nhiên:

map<int,string> mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (map<int,string>::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << it->first << " " 
     << "2nd: " << it->second << endl; 
} 

Lưu ý rằng một sự khác biệt chủ yếu giữa một bản đồ và một vectơ các cặp là một bản đồ sắp xếp lại các phần tử bằng cách sắp xếp chúng theo khóa của chúng. Thứ tự chèn không thể được truy vấn sau đó. Có những trường hợp bạn không muốn làm điều đó (khi thứ tự chèn quan trọng), vì vậy trong các trường hợp như vậy, giải pháp hoặc vectơ của bạn với các loại tùy chỉnh có chứa ít nhất khóa và giá trị là giải pháp đúng.

+0

Tôi nghĩ biến thể thứ 2 phải là' (* nó) .first' –

+0

@ g-makulik Tất nhiên, cảm ơn. – leemes

+0

Có, tùy chọn thứ 2 là đúng! Cảm ơn. Bạn thật tuyệt vời! –

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