Vector 带条件向量元素的复制索引
我想保存向量元素为false的bool向量的索引 我有以下代码: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(),
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;
}