2012-10-12 34 views
51

tôi có mã này:Làm thế nào để lặp std :: set?

std::set<unsigned long>::iterator it; 
for (it = SERVER_IPS.begin(); it != SERVER_IPS.end(); ++it) 
{ 
    u_long f = it; // error here 
} 

Không có giá trị ->first. Làm cách nào để có được giá trị?

Trả lời

88

Bạn phải bỏ qua vòng lặp của trình lặp để lấy thành viên của tập hợp.

std::set<unsigned long>::iterator it; 
for (it = SERVER_IPS.begin(); it != SERVER_IPS.end(); ++it) 
{ 
    u_long f = *it; // Note the "*" here 
} 

Nếu bạn có C++ 11 tính năng, bạn có thể sử dụng một range-based for loop:

for(auto f : SERVER_IPS) { 
    // use f here 
}  
+0

@ Mr.C64 Không phải là nó quan trọng hơn nhiều với các loại không thể thiếu như trong trường hợp này. –

+0

Có thể đáng lưu ý rằng bạn cần sử dụng thẻ đầu tiên nếu bạn có ý định sửa đổi vùng chứa. Đối với các googlers đó là. –

+1

Tôi điều C++ 11 giải pháp nên được tham khảo (tự động & f). Nó là tốt hơn cho hầu hết các trường hợp. Đối với trường hợp cụ thể này là tốt. – jaskmar

7

Chỉ cần sử dụng * trước it:

set<unsigned long>::iterator it; 
    for (it = myset.begin(); it != myset.end(); it++) { 
     cout << *it; 
    } 

này dereferences nó và cho phép bạn truy cập phần tử mà trình lặp hiện đang bật.

+3

Chỉ cần một lưu ý nhỏ: nó thường được ưa thích để sử dụng ++ nó thay vì nó ++ trong vòng lặp để tránh một bản sao thêm của iterator. – user2891462

1

Đây là một giải pháp hoàn chỉnh cho câu hỏi:

Làm thế nào để bạn lặp std :: set?

int main(int argc,char *argv[]) 
{ 
    std::set<int> mset; 
    mset.insert(1); 
    mset.insert(2); 
    mset.insert(3); 

    for (auto it = mset.begin(); it != mset.end(); it++) 
     std::cout << *it; 
} 
+1

Hoặc thậm chí 'cho (auto i: mset) std :: cout << i;' –

4

Một ví dụ khác cho C++ 11 standart:

set<int> data; 
data.insert(4); 
data.insert(5); 

for (const int &number : data) 
    cout << number; 
Các vấn đề liên quan