仅使用数组的一部分

Pgr*_*rAm 10 c++ arrays

我有一个动态分配的float数组,我需要将此数组作为参数传递给三个不同的函数,但每个函数需要获得不同的数组范围.有没有什么方法可以将带有元素0到23的数组发送到一个函数,将元素24到38发送到另一个函数,将元素39到64发送到第三个函数.

在某些语言中(比如python,我认为)你可以这样做:

somefunction(my_array[0:23]);
somefunction(my_array[24:38]);
somefunction(my_array[39:64]);
Run Code Online (Sandbox Code Playgroud)

但是我使用的是c ++,我不知道在c ++中有什么方法可以做到这一点.

有人知道怎么做这个吗?

somefunction(); 是一个API函数,所以我不能修改它所需的参数.

Har*_*lby 12

如果你编写函数来操作一对前向迭代器而不是数组,你可以像这样传递它:

somefunction1(my_array, my_array + 24);
somefunciton2(my_array + 24, my_array + 39);
somefunction3(my_array + 39, my_array + 65);
Run Code Online (Sandbox Code Playgroud)

指针是前向迭代器,这将允许函数在矢量,队列或其他STL容器的部分上使用.

  • 如果第二个arg代表传统的`end()`迭代器,你不是一个人吗? (2认同)
  • @xtofl:是的,这就是他的意思 - 抵消24,39,65而不是23,38,64. (2认同)

Ben*_*ley 6

无论如何,你的函数需要一些方法来确定数组的大小.我建议你按照标准库算法的方式使函数采用开始和结束迭代器,如下所示:

template<typename I>
void somefunction(I begin, I end);
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用您的数组调用它:

somefunction(my_array, my_array + 24);
somefunction(my_array + 24, my_array + 39);
somefunction(my_array + 39, my_array + 65);
Run Code Online (Sandbox Code Playgroud)


Aus*_*oke 5

有两种方法可以做到这一点:

void useArray(int array[], size_t len) { ... }
...
useArray(myArray, 24);
useArray(&myArray[24], 15);
useArray(&myArray[39], 26);
Run Code Online (Sandbox Code Playgroud)

或者

void useArray(int *start, int *end) { ... }
...
useArray(myArray, myArray + 24);
useArray(myArray + 24, myArray + 39);
useArray(myArray + 39, myArray + 65);
Run Code Online (Sandbox Code Playgroud)

第一个更多的是 C 方式,第二个更多的是 C++ 方式。请注意,对于第二种方式,范围是[start, end)- ,end但不包含在您在 C++ 中看到的很多范围中。


编辑:您编辑了您的帖子以提及您正在使用glTexCoordPointer(). 在这种情况下,将数组的开头传递给glTexCoordPointer(),这将是myArray,myArray + 24myArray + 39

不过,仍然必须知道数组的大小,并将其传递给诸如glDrawArraysor之类的函数glDrawElements(),然后该函数将开始从数组中读取数据。如果您使用的是glDrawArrays(),则数组的长度将作为第二个参数传递。因此你的代码可能是这样的:

glTexCoordPointer(..., ..., ..., my_array);
...
glDrawArrays(..., 0, 24);

glTexCoordPointer(..., ..., ..., my_array + 24);
...
glDrawArrays(..., 0, 15);

glTexCoordPointer(..., ..., ..., my_array + 39);
...
glDrawArrays(..., 0, 26);
Run Code Online (Sandbox Code Playgroud)


Al *_* P. 5

python示例正在制作副本.如果你的用例没问题,你可以这样做(我正在为std :: vector换掉你的vanilla数组):

#include <iostream>
#include <vector>

void somefunction(std::vector<int> v) {
    std::cout << "vector has " << v.size() << " elements,"
        << " first value is " << *v.begin() << ","
        << " last value is " << *(v.end()-1) << std::endl;
}

int main() {
    std::vector<int> a;
    for (int i=0; i<65; i++) {
        a.push_back(i);
    }
    somefunction(std::vector<int>(a.begin(),a.begin()+23));
    somefunction(std::vector<int>(a.begin()+24,a.begin()+38));
    somefunction(std::vector<int>(a.begin()+39,a.begin()+65));
}
Run Code Online (Sandbox Code Playgroud)

哪个输出:

vector has 23 elements, first value is 0, last value is 22
vector has 15 elements, first value is 23, last value is 37
vector has 27 elements, first value is 38, last value is 64
Run Code Online (Sandbox Code Playgroud)

但听起来你不能使用std :: vector,因为somefunction()有一个你无法改变的签名.幸运的是,您只需手动复制阵列的某些部分就可以进行类似的体操,如下所示:

#include <iostream>
#include <string.h>

void somefunction(int v[], int len) {
    std::cout << "vector has " << len << " elements,"
        << " first value is " << v[0] << ","
        << " last value is " << v[len-1] << std::endl;
}

int main() {
    int a[65];
    for (int i=0; i<65; i++) {
        a[i] = i;
    }
    int b[23];
    memcpy(b, a, 23*sizeof(int));
    somefunction(b, 23);
    int c[15];
    memcpy(c, a+23, 15*sizeof(int));
    somefunction(c, 15);
    int d[27];
    memcpy(d, a+38, 27*sizeof(int));
    somefunction(d, 27);
}
Run Code Online (Sandbox Code Playgroud)

再次输出:

vector has 23 elements, first value is 0, last value is 22
vector has 15 elements, first value is 23, last value is 37
vector has 27 elements, first value is 38, last value is 64
Run Code Online (Sandbox Code Playgroud)