No código abaixo, eu poderia usar a sintaxe conveniente de std::ranges::transform
para copiar valores de array de estruturas (AoS) para estrutura de arrays (SoA) (neste exemplo, apenas um vetor). Existe uma maneira de fazer o mesmo de forma oposta, copiando dados de um campo específico de estrutura quando eu preciso copiar valores de SoA para AoS?
Especificamente, existe uma maneira de substituir o for-loop no código abaixo por alguma chamada de algoritmo (intervalos de visualizações seriam preferíveis)?
#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>
struct S
{
float v1;
float v2;
};
int main() {
std::vector<S> aos = { { 1.0f, 2.0f } };
std::vector<float> soa(aos.size());
std::ranges::transform(aos, soa.begin(), &S::v1);
std::cout << "soa value:" << soa[0] << std::endl;
soa[0] = 3.0;
// I want to replace this with something transform-like above
for (std::size_t i = 0; i < soa.size(); ++i)
{
aos[i].v1 = soa[i];
}
std::cout << "aos value:" << aos[0].v1 << std::endl;
}
Você pode copiar os dados para a visualização de transformação
v1
sem tocar no membrov2
:Demonstração