C,C ++或Objective-C中的System.arraycopy()等效项

时间:2015-03-21 18:42:44

标签: java c++ objective-c c

我正在将一个Android应用程序(java)移植到ios应用程序。它的一部分是实时显示图。

我使用此代码将值插入数组的索引0:

public double[] points;
.....
//Clear array value at first index
System.arraycopy(points, 0, points, 1, points.length - 1);
//Add new value to first index
points[0] = sample;

对此有疑问,但对我的情况没有用。

我可以使用NSMutableArray和NSNumber来获取结果,但它需要更多的代码然后CPU

4 个答案:

答案 0 :(得分:2)

在C中,最初会做:

size_t n_points = 512;
double *points = calloc(512, sizeof(double));

然后逻辑是:

memmove(points + 1, points, n_points - 1);
*points = sample;

虽然更好的方法是使用环形缓冲区 - 所以不要移动缓冲区周围的值,只需移动被认为是开头的索引:

size_t n_points = 512;
double *points = calloc(512, sizeof(double));
ssize_t beginning = 0;

if (--beginning < 0) {
    beginning += n_points;
}
points[beginning] = sample;

然后在绘图代码中:

ssize_t idx, i;
for (idx = beginning, i = 0;
     i < n_points;
     i ++, idx = (idx + 1) % n_points)
{
    // i runs from 0 ... n_points - 1
    set_pixel(i, points[idx], black);
}

答案 1 :(得分:0)

C ++ 中,我很想用std::vector代替Java数组:

#include <vector>
#include <iostream>

int main()
{
    struct point
    {
        int x, y;
        point(int x, int y): x(x), y(y) {}
    };

    std::vector<point> points;

    point sample {2, 7};

    points.insert(points.begin(), sample); // insert at beginning
    points.insert(points.begin(), {9, 3});
    points.insert(points.begin(), {4, 8});

    points.push_back(sample); // insert at end

    for(auto p: points)
        std::cout << "{" << p.x << ", " << p.y << "}" << '\n';
}

如果您执行批次,如果在开头插入std::deque可能值得一看。

参考: How a std::vector works

答案 2 :(得分:0)

在Objective-C中,您可以使用NSMutableArray方法在索引0处插入项目。

 - (void)insertObject:(id)anObject atIndex:(NSUInteger)index

答案 3 :(得分:0)

通过快速Google搜索,System.arrayCopy()看起来像是将源数组的子集复制到目标数组中。

听起来您希望新阵列成为NSMutableArray,并且想要使用 - insertObjects:atIndexes:。该方法将NSIndexSet作为输入。您可以使用NSIndexSet方法indexSetWithIndexesInRange从一系列索引创建索引集。