Як виконати ітерацію std :: set?


91

У мене є такий код:

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

->firstЦінність відсутня . Як я можу отримати значення?

Відповіді:


142

Ви повинні розблокувати ітератор, щоб отримати члена вашого набору.

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

Якщо у вас є можливості C ++ 11, ви можете використовувати цикл for на основі діапазону :

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

@ Mr.C64 Не те, що це важливо для інтегральних типів, як у цьому випадку.
Якийсь чувак-програміст

1
Можливо, варто зазначити, що вам потрібно використовувати перший, якщо ви маєте намір змінити контейнер. Для гуглерів, що є.
Legion Daeth

3
Я вважаю, що рішення C ++ 11 має бути з посиланням (auto & f). Це краще для більшості випадків. Для цього конкретного випадку також.
jaskmar

Привіт, Роб, а що, якщо я хочу посилатися на елементи в SERVER_IPS, крім оголошення нової змінної u_long? Чи можу я використовувати u_long & f = * it; ? А якщо ні, то що мені робити?
BioCoder

1
@BioCoder - Ви можете використовувати довідкову змінну, але вона повинна бути Const посилальної змінної, наприклад , так: const u_long& f = *it;.
Робᵩ

15

Просто використовуйте *раніше it:

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

Це розмежовує його та дозволяє отримати доступ до елемента, в якому в даний час знаходиться ітератор.


7
Лише незначна примітка: як правило, переважно використовувати ++ це замість нього ++ у циклах for, щоб уникнути зайвої копії ітератора.
user2891462

14

Інший приклад для стандарту C ++ 11:

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

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

5

Як ви повторюєте 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
Або навітьfor(auto i : mset) std::cout << i;
Джек Діт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.