复制带条件的矢量元素的索引
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 true
或 false
的一元函数。最好使用简单的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 0
到 vi
的索引。尽管您可以使用 -1
然后在 vi
中删除它们
[&](const bool b ){
counter++;
if( !b ) return counter;
else return -1;
}
但简单的 for
仍然是更好的解决方案。
我想保存向量元素为假的布尔向量的索引。
我有以下代码:
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 true
或 false
的一元函数。最好使用简单的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 0
到 vi
的索引。尽管您可以使用 -1
然后在 vi
[&](const bool b ){
counter++;
if( !b ) return counter;
else return -1;
}
但简单的 for
仍然是更好的解决方案。