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


91

Tôi có mã này:

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ó ->firstgiá trị. Làm thế nào tôi có thể nhận được giá trị?

Câu trả lời:


142

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

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ác tính năng C ++ 11, bạn có thể sử dụng vòng lặp for dựa trên phạm vi :

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

@ Mr.C64 Không quan trọng lắm với các kiểu tích phân như trong trường hợp này.
Một số lập trình viên dude

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

3
Tôi điều giải pháp C ++ 11 nên có tham chiếu (auto & f). Nó 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

Xin chào Rob, điều gì sẽ xảy ra nếu tôi muốn tham chiếu đến các phần tử trong SERVER_IPS ngoài việc khai báo một biến u_long mới? Tôi có thể sử dụng u_long & f = * it; ? Và nếu không, tôi phải làm gì?
BioCoder

1
@BioCoder - Bạn có thể sử dụng một biến tham chiếu, nhưng nó phải là một const biến tham chiếu, như vậy: const u_long& f = *it;.
Robᵩ

15

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

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

Điều này bỏ qua nó và cho phép bạn truy cập vào phần tử mà trình lặp hiện đang sử dụng.


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

14

Một ví dụ khác cho tiêu chuẩn C ++ 11:

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

for (const int &number : data)
  cout << number;

5

Làm thế nào để bạn lặp lại 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;
}

2
Hoặc thậm chífor(auto i : mset) std::cout << i;
Jack Deeth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.