Bu yapıldığında: gerçekten okunabilir görünüyor aşağıda gösterildiği gibi gelecekte sözdizimi ikisi için/tüm kapları kısa elini destek amaçlı olarak değil bir neden ... var mı zip adlı bir işlev kullanarak.
for i in zip([1,2,3], (1,2,3), { 0:0, 1:1, 2:2 }):
l,t,d = i
print("list item: %d, tuple item %d, dict item %d" % (l,t,d))
Sen, mesela bu işlevselliği elde etmek C++ bir dizi kütüphanesini kullanabilirsiniz: Örnek olarak, Python bir demet bağımsız değişkenler üzerinde üzerinde dolaşır yerleşik bir zip vardır ve döner Boost.Range veya Eric Niebler's rangev3. Aralıklar maalesef C++ 17 standardında oy kullanmamıştı ancak asla bir dizi kütüphanesi olmayan bir projeye başlamamıştım. Boost.Range olarak işlev combine
denir:
#include <boost/range/combine.hpp>
#include <iostream>
#include <vector>
#include <list>
int main(int, const char*[])
{
std::vector<int> const v{0,1,2,3,4};
std::list<char> const l{'a', 'b', 'c', 'd', 'e'};
for(auto const& i: boost::combine(v, l))
{
int ti;
char tc;
std::tie(ti,tc) = i;
std::cout << '(' << ti << ',' << tv << ')' << '\n';
}
return 0;
}
17 C++ ile yapılandırılmış bağlama ile std::tie
değiştirip std::tie
ile olağandışı "başlatma" tür kaldırabilirsiniz. Ben aralıkları C++ 17 yer almayan pişman olsa
for(auto const& [ti,tc] : boost::combine(v, l)) {
std::cout << '(' << ti << ',' << tv << ')' << '\n';
}
, ben yapılandırılmış bağlamaları büyük ilerleme ve ciddi şekilde kod yazılır değişeceğini düşünüyorum. Standartta yer almak, onları daha popüler hale getirecek ve onları C++ programcısının bilmesi gereken standart bir özellik olarak bilmedikleri bir şey olduğu için birçok kişinin itiraz ettiği bir üçüncü parti kütüphanesinden yükseltecektir.
Olası iki kopyası [Aynı anda iki veya daha fazla kapsayıcının üzerinde yineleme yapmanın en iyi yolu nedir?] (Http://stackoverflow.com/questions/12552277/whats-the-best-way-to-iterate-over-two-or - Daha fazla kaplar-eş zamanlı olarak) – ildjarn
Yüzeyde, evet ... ama cevaplardan herhangi biri (a) okunabilir ve (b) genel ve (c) standart C++? Gördüğümden değil. C'nin ilk günlerinden biri için (i = 0, j = 0, k = 0; i
omatai
[miterator] 'a bir göz atın (https://github.com/ClaasBontus/miterator). C++ 20'den önce olmayacak olan aralıklarla daha kolay hale gelecektir. –