Std :: set nasıl yinelenir?


92

Bu koda sahibim:

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

->firstDeğer yok . Değeri nasıl elde edebilirim?

Yanıtlar:


145

Kümenizin üyesini almak için yineleyiciye başvurmayı kaldırmalısınız.

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 özellikleriniz varsa, aralık tabanlı bir for döngüsü kullanabilirsiniz :

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

@ Mr.C64 Bu durumda olduğu gibi integral türleri için çok önemli değil.
Bazı programcı ahbap

1
Kapsayıcıyı değiştirmek istiyorsanız, ilkini kullanmanız gerektiğini belirtmekte fayda var. Google çalışanları için.
Legion Daeth

3
C ++ 11 çözümünün referansla olması gerektiğini düşünüyorum (auto & f). Çoğu durumda daha iyidir. Bu özel durum için de.
jaskmar

Merhaba Rob, yeni bir u_long değişkeni bildirmek dışında SERVER_IPS içindeki öğelere başvurmak istersem ne olur? U_long & f = * it; kullanabilir miyim? ? Ve değilse ne yapmalıyım?
BioCoder

1
@BioCoder - Bir referans değişkeni kullanabilirsiniz, ancak bu bir olmalıdır const şöyle referans değişken: const u_long& f = *it;.
Robᵩ

15

Sadece kullanmak *önce it:

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

Bu, onun referansını kaldırır ve yineleyicinin şu anda üzerinde olduğu öğeye erişmenizi sağlar.


7
Küçük bir not: genellikle yineleyicinin fazladan bir kopyasını önlemek için döngüler için it ++ yerine ++ kullanmak tercih edilir.
user2891462

14

C ++ 11 standardı için başka bir örnek:

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

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

5

Std :: set'i nasıl yinelersiniz?

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
Veya hattafor(auto i : mset) std::cout << i;
Jack Deeth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.