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

时间:2017-06-21 10:12:13

标签: vector c++14 remove-if

我想保存我的bool向量的索引,其中vector元素为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());

但它只在我的Vector中存储True而不是索引。 我的lambda做错了什么?

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分: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条件会将0返回到vi的索引。虽然您可以使用-1,然后在vi

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

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