C ++中数组的每个n元素

时间:2013-08-11 16:41:54

标签: c++

是否有更有效的方法来获取数组的每秒(一般每N个)元素,然后是下面的简单for循环?例如,使用通用算法?

#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];  
    }   
}

6 个答案:

答案 0 :(得分:12)

for (int ax = 0; ax < a_size; ax += 2)

如果a_size接近INT_MAX,请务必小心。

答案 1 :(得分:2)

循环应该足够好。正如Pete所指出的,你可以避免模数测试。

 for (int ax = 0; ax < a_size; ax += 2)
   ...

C ++通过valarray标题提供对切片的支持(例如,查看std::slice_array)。

我不知道这是不是你要找的。它适用于重量级数值计算。如果您不确定,我认为简单的循环是正确的答案。

答案 2 :(得分:2)

如果效率更高,意味着内存占用更少,那么我会选择使用指针而不是数组访问。例如,您可以使用指针以下列方式实现您想要的内容。

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;
    }
}

这个例子应该比数组访问示例稍微快一些,我鼓励你为它自己计时。但是,在进行这些优化时,您应该始终注意的一件事是查看它是否在程序的大型方案中是否重要(不要花时间在您不需要的时候)。

答案 3 :(得分:1)

你可以轻松地创建一个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(),它们是C ++ 11,但如果你向后移动适当的函数,就像在C ++ 03中一样运行,就像我一样)< / p>

答案 4 :(得分:1)

这是最快的:

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];
  }
}

答案 5 :(得分:0)

示例:

#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];
    }   
}