3 Ekim 2019 Perşembe

C++ Range Loop

Söz Dizimi
C++11 ile gelen bu özelliğin söz dizimi şöyle
for ( for-range-declaration : expression ) statement
Üretilen kodun söz dizimi C++17'den önce şöyle.
{
  auto && __range = range-init;
  for ( auto __begin = begin-expr,
             __end = end-expr;
        __begin != __end;
        ++__begin ) {
    for-range-declaration = *__begin;
    statement
  }
}
C++17 ile şöyle.
{
  auto && __range = range_expression ;
  auto __begin = begin_expr ;
  auto __end = end_expr ;
  for ( ; __begin != __end; ++__begin) {
    range_declaration = *__begin;
    loop_statement
  }
}
Değişikliğin açıklaması şöyle.
As of C++17, the types of the begin_expr and the end_expr do not have to be the same ...
Üretilen Kod
Biz kodlarken şöyle yaparız
for(auto x:exp){ /* code */ }
Şöyle bir kod üretilir.
{
  auto&& __range=exp;
  auto __it=std::begin(__range);
  auto __end=std::end(__range);
  for(; __it!=__end;++__it){
    auto x=*__it;
    /* code */
  }
}
Yani iterator ile container üzerinde dolaşılıyor.

container nesnesinin yok olması
Aşağıdaki kod döngü daha başlamadan S geçici nesnesi bellekten silindiği için hatalıdır.
struct S
{
  map<string, string> m;

  S()
  {
    m["key"] = "b";
  }

  const string &func() const
  {
    return m.find("key")->second;
  }
};

for (char c : S().func())
  cout << c;
range içinde container'dan silme işlemi
Kesinlikle yapılmamalıdır. Aşağıdaki kod hatalıdır.
std::map<int, int> someMap;
/* Fill in someMap */
for (auto& element : someMap)
{
    /* ... */
    if ( /* Some condition */ )
        someMap.erase(element.first);
}
Bu kod da hatalıdır.
for (string & s : set)
{
    map.erase(s);
}




Hiç yorum yok:

Yorum Gönder