2017-06-21 46 views
0

我想保存向量元素为false的我的布尔向量的索引。向量元素的条件复制索引

我有下面的代码:在我的矢量

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()); 

但它只存储真正的而不是指数。 我的lambda做错了什么?

回答

0

std::copy_if的工作原理与您预期的不同,它会将实际元素传递给谓词,并在谓词返回true时将其复制到第二个容器中。

如果你想索引,使用一个简单的循环for

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接受应该返回truefalse的UnaryFunction。最好使用简单的for


如果都要求使用algorithm库,你可以使用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; 
       } 
       ); 

但这个问题是,对于true条件返回0vi索引。虽然你可以使用-1后来删除里面vi

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

但仍然是一个简单的for是一个更好的解决方案。