复制带条件的矢量元素的索引

Copy index of vector Elements with condition

我想保存向量元素为假的布尔向量的索引。

我有以下代码:

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 中存储 True 而不是索引。 我的 lambda 做错了什么?

std::copy_if 的工作方式与您预期的不同,它将实际元素传递给谓词,如果谓词 returns true.[=15= 则将其复制到第二个容器中]

如果你想要索引,使用一个简单的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::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 接受应该 return truefalse 的一元函数。最好使用简单的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 条件 returns 0vi 的索引。尽管您可以使用 -1 然后在 vi

中删除它们
                [&](const bool b ){
                    counter++;
                    if( !b ) return counter;
                    else     return -1;
                }

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