2016-05-07 1 views
1

In den zwei Lambdas in den darunter liegenden For-Schleifen empfahl ein Experte (oder zumindest ein Experte, der besser als ich ist), den Index 'j' zu verwenden, der in der zweiten Schleife gezeigt wird. Ich möchte verstehen, warum, wenn funktional, die Ausgabe nicht anders ist.Lambda-Funktionen C++: Macht das Erfassen des Index einer Schleife einen Unterschied?

Mein ausführbares Programm ist auf Github here.

for(int j = 0;j<recPtr->numThreads;j++){ 

    recPtr->heads[j] = 0; 
    recPtr->tails[j] = 0; 
    headsPtr = &recPtr->heads[j]; // Get the address of the index of the array, one element for each thread for heads. 
    tailsPtr = &recPtr->tails[j]; // Get the address of the index of the array, one element for each thread for heads. 

    threads.push_back(thread([headsPtr, tailsPtr, timesToToss]() 
    { 
     for(int k=0;k<timesToToss;k++) 
     { 
      if (Tosser(dre)) ++(*headsPtr); 
      else ++(*tailsPtr); 
     } 
    })); //Toss a coin! 
} 


for (int j = 0; j < recPtr->numThreads; j++) 
{ 

    recPtr->heads[j] = 0; 
    recPtr->tails[j] = 0; 
    headsPtr = &recPtr->heads[j]; // Get the address of the index of the array, one element for each thread for heads. 
    tailsPtr = &recPtr->tails[j]; // Get the address of the index of the array, one element for each thread for heads. 

    threads.push_back(thread([j, headsPtr, tailsPtr, timesToToss]() 
    { 
     for(int k=0;k<timesToToss;k++) 
     { 
      if (Tosser(dre)) ++(*headsPtr); 
      else ++(*tailsPtr); 
     } 
    })); //Toss a coin! 
} 
+2

von Menschen Hüte, die sie als „Experten“, wenn es um C++ geliefert wird ... – Brian

+1

... oder jede andere Sprache auch. Jemand anderen einen Experten nennen, gut. Sich selbst nennen, nein. Aber ich bin mir nicht sicher, ob ich verstehe, was du willst. Wie willst du j benutzen? – deviantfan

+0

Ich verstand Sie dort - aus meiner Sicht löste er/sie das, was wie ein schwieriges Multithreading-Problem schien, über das ich eine Woche lang arbeitete, also ist vielleicht "mehr Experte als ich" genauer. Ich bin derjenige, der sie als Experten bezeichnet. – NonCreature0714

Antwort

2

Das Lambda nicht j nicht verwendet, daher gibt es keinen Grund, sie zu erfassen. Es bietet Ihnen keinen Nutzen.

Aber Sie machen Ihre Schließung größer durch einen int, extra int Kopien entstehen und zusätzlich verwirrend zukünftigen Zuschauer des Codes (einschließlich sich selbst), die sich fragen, ob eine frühere Iteration des Codes vor der j gebraucht hatte.

So erfassen Sie nicht j.

0

die Variable Capturing j von Wert in Ihrem Lambda überflüssig ist wie Sie sich nicht in dem Lambda-Körper mit ...

Aber auf der anderen Seite, wenn j wurde in dem Lambda-Körper verwendet wird, dann ja Es muss erfasst werden, um verwendet zu werden. Mehr über Lambda-Capture here

Hier ist ein kleines Beispiel:

int main() 
{ 
    int j { 9 }; 
    auto lambda = [ ]() { cout << j << '\n'; }; 
       //^error 'j' not captured 

    lambda(); 
} 
Verwandte Themen