gpt4 book ai didi

c++ - 随机访问不同大小的原始缓冲区数组?

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

我有一个数组数组:struct chunk { char * data; size_t 尺寸; };大块 * 大块;。每个 block 中的数据大小是动态的并且 block 之间不同。使用嵌套的 for 循环可以轻松地对数据进行线性访问:

for (chunk * chunk_it = chunks; chunk_it != chunks + count; ++chunk_it) {
for (char * it = chunk_it->data; it != chunk_it->data + chunk_it->size; ++it) {
/* use it here */
}
}

我想使用 operator[] 作为接口(interface)将其转换为对 chunks->data 的随机访问,跨越多个 block

它的工作原理是线性搜索正确的 block ,然后只计算我想要的数据的偏移量。

template <class T>
void random_access(int n) {
chunk * c;
for (int i = 0; i < count; ++i) {
c = chunks + i;
size_t size = c->size;
if (n - size < 0) {
n -= size; // mutate n to fit into current chunk
} else {
break; // found
}
}

T * data = reinterpret_cast<T *>(c->data + n);

// use data here
}

有没有更有效的方法来做到这一点?每次我需要 block 中的 T 时都这样做会很疯狂。我计划线性迭代所有 block 数据,但我想在函数外部使用数据,因此需要在内部循环中返回它(因此我想将其翻转过来)。我还考虑过在内部循环中使用函数指针,但不只是使用 chunk_iterator[n] 会更好。

最佳答案

我知道你的数据结构比较复杂,但你能不能不做这样的事情?

我构建了一个连续的 block 数据 block ,并在 block 数组<中记录每个 block 的位置大小/em>:

class chunk_manager
{
struct chunk
{
std::size_t position;
std::size_t size;

chunk(std::size_t position, std::size_t size)
: position(position), size(size) {}
};

public:

void add_chunk(std::string const& chunk)
{
m_chunks.emplace_back(m_data.size(), chunk.size());
m_data.append(chunk);
}

char* random_access(std::size_t n) { return &m_data[n]; }

std::size_t size_in_bytes() const { return m_data.size(); }

private:
std::vector<chunk> m_chunks;
std::string m_data;
};

int main()
{
chunk_manager cm;

cm.add_chunk("abc");
cm.add_chunk("def");
cm.add_chunk("ghi");

for(auto n = 0ULL; n < cm.size_in_bytes(); ++n)
std::cout << cm.random_access(n) << '\n';
}

关于c++ - 随机访问不同大小的原始缓冲区数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52847492/

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