gpt4 book ai didi

c++ - 混合/修改数组访问

转载 作者:行者123 更新时间:2023-11-28 04:33:15 28 4
gpt4 key购买 nike

我有一个字节数组,我想更改它的访问方式。这是数组:

char bytes[100];

我想要另一个数组来改变原始数组的访问方式。如果我们可以将引用放在数组中,它看起来像这样:

char& bytes_ref[50];
for(size_t i = 0; i < 50; i++){
bytes_ref[i] = bytes[i * 2];
}

尽管引用数组无效。我想出了这个理论上可以做我想做的事:

#include <iostream>
struct Byte {
char* ref;

Byte(){}

Byte(char& c){
ref = &c;
}

operator char&() const {
return *ref;
}
};

int main(){
char bytes[100];
Byte bytes_ref[50];
for(size_t i = 0; i < 50; i++){
bytes_ref[i] = bytes[i * 2];
}
}

虽然这能像我想要的那样工作,但它占用了大量空间。

有没有什么方法可以做到这一点而不会每个条目多使用 7 个字节?我的直觉是否定的,但我希望 C++ 中可能有某种特殊功能可以做到这一点,或者可以进行一些直接的内存操作和访问。

我想要这样做的原因是我有一个字节数组来表示 NV21 格式的图像。我想创建一个单独的数组来引用原始缓冲区中的字节但占用一半像素,从而有效地动态调整图像大小。

我必须将 char** 传递给不受控制的库。

提前致谢!

最佳答案

我不认为你可以使用比每个元素一个指针更少的内存

如果您需要将 char* 数组传递给不受控制的库,我知道您必须分配整个数组,因为这是库所期望的。代码如下:

std::array<char*, 50> bytes_ref;
for(size_t i = 0; i < bytes_ref.size(); ++i){
bytes_ref[i] = &bytes[i * 2];
}

然后,您可以将数组传递为:

f(bytes_ref.data());

如果您不需要使用 char**,您将有更多选择。您可以使用 std::reference_wrapper 尽管它的大小类似于指针。如果你总是要跳过 2 个元素,你可以为此创建一个对象。例如:

class Wrapper {
public:
Wrapper(char *origin) : m_origin(origin) {}
char* operator[](size_t index) {return m_origin + 2*index;}
private:
char *m_origin;
};

以上将使用 [] 运算符返回指向每 2 个元素的指针。

关于c++ - 混合/修改数组访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52300518/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com