Czy w tym przykładzie można zastąpić BOOST_FOREACH
"czystym" odpowiednikiem C++ 11?Zamień BOOST_FOREACH na "czystą" wersję C++ 11?
#include <map>
#include <functional>
#include <boost/foreach.hpp>
#include <iostream>
int main() {
std::map<int, std::string> map = {std::make_pair(1,"one"), std::make_pair(2,"two")};
int k;
std::string v;
BOOST_FOREACH(std::tie(k, v), map) {
std::cout << "k=" << k << " - " << v << std::endl;
}
}
Kluczową cechą jest utrzymywanie parę klucz/wartość w odnośnikach do k
i v
.
Próbowałem:
for(std::tie(k,v) : map)
{
std::cout << "k=" << k << " - " << v << std::endl;
}
i
auto i = std::tie(k,v);
for(i : map)
{
std::cout << "k=" << k << " - " << v << std::endl;
}
Ale żaden z wahała się w oparciu o pomysły pętli wydawało się do pracy. Przypuszczalnie wahał oparty na pętli musi posiadać deklarację przed :
, ponieważ nawet:
std::vector<int> test;
int i;
for (i : test);
jest nieprawidłowy.
Najbliższym odpowiednikiem mogę znaleźć to:
for (auto it = map.begin(); it!=map.end() && (std::tie(k,v)=*it,1); ++it)
{
std::cout << "k=" << k << " - " << v << std::endl;
}
który nie jest tak zwięzły jak wersja BOOST_FOREACH
!
Czy istnieje sposób na przedstawienie tego samego w sposób zwięzły bez zwiększenia w C++ 11?
nie Czy kopiowanie ciąg na każdej iteracji w pierwszym przykładzie? Czy naprawdę tego chcesz? – pmr