2017-06-21 2 views
0

Ich möchte die Indizes meines Bool-Vektors, wo das Vektorelement falsch ist.Kopieren Sie den Index des Vektors Elemente mit der Bedingung

Ich habe den folgenden Code:

vector<bool> incumbent_solution; // (0,0,0,1,1,0,0)... 
vector<int> I_minus_S(incumbent_solution.size()); 

auto it = copy_if(incumbent_solution.begin(), incumbent_solution.end(), 
     I_minus_S.begin(), [&incumbent_solution](auto i) {if (incumbent_solution[i] == 0] return i; }); 
I_minus_S.erase(it, I_minus_S.end()); 

Aber es True Geschäfte in meiner Vector und nicht die Indizes. Was macht mein Lambda falsch?

Antwort

0

Die std::copy_if funktioniert anders als Sie erwartet, es übergibt das tatsächliche Element an das Prädikat und kopiert es in den zweiten Container, wenn das Prädikat true zurückgibt.

Wenn Sie Indizes möchten, verwenden Sie eine einfache for Schleife:

std::vector<bool> incumbent_solution { 0, 0, 0, 1, 1, 0, 0, 1, 1 }; 
std::vector<int> I_minus_S(incumbent_solution.size()); 

std::size_t last = 0; 

for(std::size_t index = 0; index < incumbent_solution.size(); ++index) { 
    if(incumbent_solution[index] == false) 
     I_minus_S[last++] = index; 
} 

I_minus_S.erase(I_minus_S.begin() + last, I_minus_S.end()); 
0
std::vector<bool> vb = { 0,0,0,1,1,0,0 }; 
std::vector<int> vi; 

unsigned counter = 0; 
for(bool b : vb){ 
    if(!b){ 
     vi.push_back(counter); 
    } 
    ++counter; 
} 

for(int& i : vi){ 
    std::cout << i << '\n'; 
} 

std::copy_if akzeptiert eine UnaryFunction die true oder false zurückkehren. Es ist besser, ein einfaches for zu verwenden.


Wenn Sie algorithm Bibliothek verwenden anspruchsvoll sind, können Sie transform

std::vector<bool> vb = { 0,0,0,1,1,0,0 }; 
std::vector<int> vi; 

int counter = -1; 

std::transform(vb.begin(), vb.end(), std::back_inserter(vi), 
       [&](const bool b){ 
        counter++; 
        if(!b) return counter; 
       } 
       ); 

verwenden, aber das Problem mit diesem ist, für true Zustand 0 dem Index der vi zurückgibt. Obwohl Sie -1 verwenden können, und entfernen Sie sie später innerhalb vi

   [&](const bool b){ 
        counter++; 
        if(!b) return counter; 
        else  return -1; 
       } 

aber immer noch ein einfaches for ist eine bessere Lösung.

Verwandte Themen