C++ 中的快速 where() 函数
Fast where() function in C++
我有一个用 0 和 1 填充的整数数组。我正在寻找 C/C++ 中获取 1 的位置(索引)的最快方法,类似于 numpy 中的 where() 函数。
编辑 1:因为我只存储位,所以 char 数组也可以完成这项工作。
编辑 2:示例:
char a[5];
a[0]=0;
a[1]=1;
a[2]=1;
a[3]=0;
a[4]=1;
应该return
1,2,4
数组的类型并不重要,但我必须尽快找到1s的位置。
如果你只存储位,我想你可以只使用 bool 类型,而不是 char。
const unsigned int size = 5;
bool bits[size] = {0 , 1 , 0 , 1 , 0};
std::vector<unsigned int> indices;
auto ptr = &bits[0];
for (int i = 0; i<size; i++, ptr++)
{
if (*ptr) indices.push_back (i);
}
如果速度对你来说比内存更重要,你可以使用常规(静态大小)数组,而不是 std::vector("enlarge" 它需要时间),一个应付-分配。
我建议您以某种方式判断位数组的近似大小,并使用索引向量的 reserve() 函数。这样你的 vector 就不必重新分配太多(甚至根本不会这样做)。
我有一个用 0 和 1 填充的整数数组。我正在寻找 C/C++ 中获取 1 的位置(索引)的最快方法,类似于 numpy 中的 where() 函数。
编辑 1:因为我只存储位,所以 char 数组也可以完成这项工作。
编辑 2:示例:
char a[5];
a[0]=0;
a[1]=1;
a[2]=1;
a[3]=0;
a[4]=1;
应该return
1,2,4
数组的类型并不重要,但我必须尽快找到1s的位置。
如果你只存储位,我想你可以只使用 bool 类型,而不是 char。
const unsigned int size = 5;
bool bits[size] = {0 , 1 , 0 , 1 , 0};
std::vector<unsigned int> indices;
auto ptr = &bits[0];
for (int i = 0; i<size; i++, ptr++)
{
if (*ptr) indices.push_back (i);
}
如果速度对你来说比内存更重要,你可以使用常规(静态大小)数组,而不是 std::vector("enlarge" 它需要时间),一个应付-分配。
我建议您以某种方式判断位数组的近似大小,并使用索引向量的 reserve() 函数。这样你的 vector 就不必重新分配太多(甚至根本不会这样做)。