C++中数组的每个n元素
Every n element of an array in C++
有没有比下面简单的for循环更有效的方法来获得数组的每一秒(通常是每N个)元素?例如,使用通用算法?
#include<iostream>
using namespace std;
int main()
{
const int a_size = 6, b_size = 3;
int a[a_size] = {1, 3, 6, 3, 2, 7};
int b[b_size];
int bx = 0;
for ( int ax = 0; ax < a_size; ++ax )
{
if (ax % 2 == 0)
b[bx++] = a[ax];
}
}
for (int ax = 0; ax < a_size; ax += 2)
如果a_size
接近INT_MAX
,请小心。
循环应该足够好。正如Pete所指出的,你可以避免模测试。
for (int ax = 0; ax < a_size; ax += 2)
...
C++通过valarray头提供了对切片的支持(例如,看看std::slice_array)。
我不知道这是不是你想要的。它适用于重量级数值计算。如果你不确定,我认为简单的循环是正确的答案。
如果你所说的高效,是指内存占用更小,速度更快,那么我会选择使用指针而不是数组访问。例如,您想要的内容可以通过以下方式通过指针来实现。
int main() {
const int a_size = 6, b_size = 3;
int a[a_size] = {1, 3, 6, 3, 2, 7};
int b[b_size];
int* a_ptr = a;
int* a_end_ptr = a_ptr + a_size;
int* b_ptr = b;
while(a_ptr < a_end_ptr) {
*b_ptr = *a_ptr;
b_ptr++;
a_ptr += 2;
}
}
这个示例应该比数组访问示例稍微快一点,我鼓励您自己计时看看。然而,在进行这些优化时,您应该始终注意的一件事是,看看它在程序的大方案中是否重要(在不必要的时候不要花时间)。
您可以轻松地创建一个every_n
谓词,并根据需要对copy_if等进行筛选。
"每n个元素"谓词的近似(注:尚未测试)示例:
/**
@brief Un predicado que retorna @c true cada @a n invocaciones.
**/
template <typename Integer>
struct every_n {
static_assert (std::numeric_limits<Integer>::is_integer, "Must behave like an integer");
public:
explicit every_n (Integer const& e)
: n(e), x(1) {}
every_n (every_n const& E)
: n(E.n), x(E.x) {}
bool operator () (...) {
if (x<n) { ++x; return false; }
else { x=Integer(1); return true; }
}
private:
Integer x;
const Integer n;
};
// "make_" idiom
template <typename Integer>
every_n<Integer> every (Integer const& c) { return every_n<Integer>(c); }
// sample usage
# include required headers, etc
using namespace std;
const int a_size = 6, b_size = 3;
int a[a_size] = {1, 3, 6, 3, 2, 7};
int b[b_size];
copy_if (begin(a), end(a), begin(b), every(3));
代码所需要的只是用一个行为类似整数的类型来调用every()
。
(代码使用static_assert、begin()、end()和copy_if(
这是最快的:
void copy_n(int & a[], int & b[], int a_sz, int n) {
int bx = 0;
for (int i=0; i<a_sz; i+=n) {
b[bx++]=a[i];
}
}
示例:
#include<iostream>
using namespace std;
int main() {
const int a_size = 6;
const int b_size = a_size / 2;
int a[a_size] = {1, 3, 6, 3, 2, 7};
int b[b_size];
for (int ax = 0, bx = 0; ax < a_size; ax += 2) {
b[bx++] = a[ax];
}
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 如何将元素添加到数组的线程安全函数?
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 输出没有重复元素的动态数组(收缩数组)C++
- 数组中最大的非重复元素
- 数组元素打印的递归方法
- 对字符数组中的元素执行逐位操作
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 通过交换元素使数组相同
- 按平均值替换数组中的元素
- 打印矢量数组中的所有元素
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 如何将元素从向量转移到新数组?
- 如何在向量数组中插入元素?
- 为什么 2 个相同数组的元素彼此相等
- C++ 中的二维整数数组,每行中的元素数量不均匀