gpt4 book ai didi

c++ - 将一种数据类型的 vector 复制到相同数据类型的结构体 vector 中的有效方法是什么?

转载 作者:行者123 更新时间:2023-12-01 21:58:05 25 4
gpt4 key购买 nike

我有一个包含 3 个成员变量 (vec3)pos (vec3)norm (vec2)texCoord 的结构 vector ,并且我还有 3 个其他独立 vector (vec3)x (vec3) )y (vec2)z 分别,我想复制/组合将独立 vector 中的数据放入我上面提到的结构数据类型的 vector 中,以便变量将根据结构中的变量对齐。我可以通过迭代 vector 的每个成员并分配变量来实现这一点,但是我正在寻找一种更快更有效的方法,通过一个或两个函数调用将 vector 的整个范围复制到另一个 vector 是否有这样的方法实现这个目标吗?

伪代码:

struct foo
{
vec3 pos;
vec3 norm;
vec2 texCoord;
}

vector<foo> attributes;

vector<vec3> x;
vector<vec3> y;
vector<vec2> z;

copy(x, attributes, offsetof(foo::pos), stride);
copy(y, attributes, offsetof(foo::norm), stride);
copy(z, attributes, offsetof(foo::texCoord), stride);

最佳答案

嗯,如果我们知道字节对齐,我们也许可以做一些低级的肮脏的事情。

但是如果我们在更高的层次上坚持使用 C++,我们就没有那么多的可能性了。

这里有一些例子:

#include <iostream>
#include <vector>
#include <algorithm>
#include <vector>
#include <iterator>


using vec3 = int;
using vec2 = int;

struct foo
{
vec3 pos;
vec3 norm;
vec2 texCoord;
};

int main() {

std::vector<foo> attributes{};

std::vector<vec3> x{1,2,3};
std::vector<vec3> y{4,5,6};
std::vector<vec2> z{7,8,9};

// How many elements do we need to copy
size_t elementsToCopy {std::min({x.size(), y.size(), z.size()})};


// Solution 1 one. Straight forward. Emplace back and creation of temporary is slow
for (size_t i = 0; i < elementsToCopy; ++i)
attributes.emplace_back(foo {x[i],y[i],z[i]});


// Solution 2. Slight improvement. Set initial size of target vector. Then copy in simple loop. Creation of temporary is slow
attributes.resize(elementsToCopy);
for (size_t i = 0; i < elementsToCopy; ++i)
attributes[i] = std::move(foo ({x[i],y[i],z[i]}));

// Wrapping in algorithm. But no real improvement. More a less just obfuscation
std::for_each(attributes.begin(), attributes.end(), [i=0U, &x,&y,&z](foo &f) mutable { return std::move(foo ({x[i],y[i],z[i]}));++i;} );

for (const auto a : attributes)
std::cout << a.pos << " " << a.norm << " " << a.texCoord << "\n";

return 0;
}

我认为,现有的算法在这里没有多大帮助。我们可以编写 lambda 或函数。但这会使代码更漂亮,但不会更快。

我认为 3 个 vector x、y、z 也存在缺陷。它们可以是任何大小。

也许为 struct foo 添加成员函数会是一个更安全的解决方案。有些添加功能或类似的。

但不幸的是我没有理想的解决方案。

关于c++ - 将一种数据类型的 vector 复制到相同数据类型的结构体 vector 中的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58909736/

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