19 Ağustos 2019 Pazartesi

std::initializer_list ve for Döngüsü

1. İç İçe Döngü
Örnek
initializer_list içindeki iki vector'ü dolaşmak için şöyle yaparız. İki tane iç içe for döngüsü kullanılır.
std::vector<std::string> v1 = { "A", "B", "C" };
std::vector<std::string> v2 = { "X", "Y", "Z" };

for ( const auto &r : { std::cref( v1 ), std::cref( v2 ) } )
{
  for ( const auto &s : r.get() )
    std::cout << s << ' ';
}
2. Const Iterator
std::initializer_list normalde const bir iterator verir. 

Örnek
Şu kod derlenmez. const iterator olduğu için std::initializer_list içindeki değerler değiştirilemez.
int a = 5, b = 6;
for (auto & i : {a, b})
{
  std::cout << i << std::endl; // Works as expected.
  i = 3;                       // Error!
}
Örnek
Şu kod derlenmez. const iterator olduğu için std::initializer_list içindeki değerler değiştirilemez.
#include <initializer_list>

struct Obj {
    int i;
};

Obj a, b;

int main() {
    for(Obj& obj : {a, b}) {
        obj.i = 123;   
    }
}
Çözmek için şöyle yaparız.
#include <initializer_list>

struct Obj {
  int i;
};

Obj a, b;

int main() {
  for(auto obj : {&a, &b}) {
    obj->i = 123;   
  }
}
Çözmek için şöyle yaparız.
#include <functional>
#include <initializer_list>
#include <iostream>

struct Obj {
  int i;
};

Obj a, b;

int main()
{
  for (Obj& obj : {std::ref(a), std::ref(b)}) { 
    obj.i = 123;
  }
  std::cout << a.i << '\n';
  std::cout << b.i << '\n';
}

Hiç yorum yok:

Yorum Gönder