Vector 带条件向量元素的复制索引

Vector 带条件向量元素的复制索引,vector,c++14,remove-if,Vector,C++14,Remove If,我想保存向量元素为false的bool向量的索引 我有以下代码: 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(),

我想保存向量元素为false的bool向量的索引

我有以下代码:

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());
vector\u解决方案;//(0,0,0,1,1,0,0)...
向量I_减去(现有的_解.size());
auto it=copy_if(现任解决方案.begin(),现任解决方案.end(),
I_减去_.S.begin(),[&现任解决方案](自动I){if(现任解决方案[I]==0]返回I;});
I_减去S.erase(它,I_减去S.end());
但它只在向量中存储True,而不是在索引中。 我的lambda做错了什么?

工作原理与您预期的不同,它将实际元素传递给谓词,并将其复制到第二个容器中(如果谓词返回
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());
std::向量u解{0,0,0,1,1,0,0,1,1};
std::向量I_减去(convertive_solution.size());
std::size\u t last=0;
对于(std::size_t index=0;index
但问题是,对于
true
,条件将
0
返回到
vi
的索引。尽管您可以使用
-1
并在
vi
中删除它们

                [&](const bool b ){
                    counter++;
                    if( !b ) return counter;
                    else     return -1;
                }
但是对于
来说,一个简单的
仍然是一个更好的解决方案

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;
                }
               );  
                [&](const bool b ){
                    counter++;
                    if( !b ) return counter;
                    else     return -1;
                }