您可能希望将这两个数组追加到现有 std::vector 或创建一个新 数组。在这两种情况下,您很可能希望一次性保留插入所需的所有内存,以避免额外的不必要的重新分配。
对于前一种情况,可以使用如下函数模板:
template<size_t... Ns>
void append_to_vector(std::vector<float>& vec, float (&...arrs)[Ns]) {
constexpr auto num_elements_to_append = sizeof...(Ns);
vec.reserve(vec.size() + num_elements_to_append);
(vec.insert(vec.end(), std::cbegin(arrs), std::cend(arrs)),...);
}
将vertices 和normals 附加到现有的std::vector<float> 变为:
std::vector<float> vec; // your existing vector
// ...
append_to_vector(vec, vertices, normals);
对于后一种情况——即,你想从这两个数组中创建一个新向量——你可以使用下面的函数模板,create_vector,然后调用append_to_vector:
template<size_t... Ns>
std::vector<float> create_vector(float (&...arrs)[Ns]) {
std::vector<float> vec;
append_to_vector(vec, arrs...);
return vec;
}
从数组 vertices 和 normals 创建一个新向量归结为一行:
auto vec = create_vector(vertices, normals);
您不限于两个数组。由于它们的可变参数特性,您实际上可以为这些函数模板提供任意数量的数组,例如:
auto vec = create_vector(vertices, vertices, normals, vertices, normals);
上面的行如您所料,即它创建了一个新向量,该向量由vertices、vertices(再次)、normals、vertices 和normals 中的元素串联而成。
在任何情况下,对于每次调用 append_to_vector(),只会执行一次重新分配最多,因为对 std::vector::reserve() 的调用确保插入新元素所需的内存在之前可用插入。