分配不同类型的多维向量

Assigning multi-dimensional vectors with different types

本文关键字:向量 同类型 分配      更新时间:2023-10-16

假设我有一个std::vector<std::vector<double>> d,想把它分配给一个std::vector<std::vector<int>> i;我能想到的最好的是:

#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<vector<double>> d = { {1.0, 2.0}, {3.0, 4.0} };
vector<vector<int>>    i;
for_each(begin(d), end(d), [&i](vector<double> &x) {
i.emplace_back(begin(x), end(x));
}
);
return 0;
}

如果两个向量在内部使用相同的类型,我可以只使用赋值运算符(请参阅复制多维向量C++(:

i = d;

如果向量在内部存储不同类型的,但一维的,我可以做到:

i.assign(begin(d), end(d));

这两者的意图都非常明显,我认为我的多维方法解决方案并非如此。有没有更好的方法或公认的成语来做到这一点?

在我看来,您对 2D 矢量的解决方案是一个很好的解决方案。 当您必须复制向量的 N 维向量时,问题就出现了......

假设你想要一个在如下情况下工作的函数copy_multi_vec()

std::vector<std::vector<std::vector<double>>> vvvd
{ { {1.0, 2.0, 3.0}, { 4.0,  5.0,  6.0} },
{ {7.0, 8.0, 9.0}, {10.0, 11.0, 12.0} } };
std::vector<std::vector<std::vector<int>>> vvvi;
copy_multi_vec(vvvi, vvvd);

在这种情况下,可以在帮助程序类中使用部分模板专用化;通过示例

template <typename T1, typename T2>
struct cmvH
{ static void func (T1 & v1, T2 const & v2) { v1 = v2; } };
template <typename T1, typename T2>
struct cmvH<std::vector<T1>, std::vector<T2>>
{
static void func (std::vector<T1> & v1, std::vector<T2> const & v2)
{
v1.resize( v2.size() );
std::size_t i { 0U };
for ( auto const & e2 : v2 )
cmvH<T1, T2>::func(v1[i++], e2);
}
};
template <typename T1, typename T2>
void copy_multi_vec (T1 & v1, T2 const & v2)
{ cmvH<T1, T2>::func(v1, v2); }

或者,如果要对最后一个级别使用assign()方法,可以按如下所示定义帮助程序结构

template <typename, typename>
struct cmvH;
template <typename T1, typename T2>
struct cmvH<std::vector<T1>, std::vector<T2>>
{
static void func (std::vector<T1> & v1, std::vector<T2> const & v2)
{
v1.resize( v2.size() );
v1.assign( v2.cbegin(), v2.cend() );
}
};
template <typename T1, typename T2>
struct cmvH<std::vector<std::vector<T1>>, std::vector<std::vector<T2>>>
{
static void func (std::vector<std::vector<T1>>       & v1,
std::vector<std::vector<T2>> const & v2)
{
v1.resize( v2.size() );
std::size_t i { 0U };
for ( auto const & e2 : v2 )
cmvH0<std::vector<T1>, std::vector<T2>>::func(v1[i++], e2);
}
};

有没有更好的方法或公认的成语来做到这一点?

一次分配数组的一个元素是无法逃避的。你能做的最好的事情就是创建一个函数来帮助它。

例如,您可以使用:

template <typename T1, typename T2>
void vector_copy(std::vector<std::vector<T1>>& dest,
std::vector<std::vector<T2>> const& src)
{
// Add the code to do the copy
}

然后,使用

vector_copy(d, i);