我想保存我的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做错了什么?
答案 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
接受应返回true
或false
的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
是一个更好的解决方案。