分配不同类型的多维向量
Assigning multi-dimensional vectors with different types
假设我有一个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);
相关文章:
- 如何创建从同一类继承的不同对象的向量
- C++中函数的向量返回类型引发错误
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 在 C++ 中输出枚举类类型的向量元素
- 如何在 c++ 中定义接受不同参数类型的函数向量?
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 具有 STL 向量类型成员的类的复制内存
- 将不同类型的变量添加到向量中
- std::<key-value>不同类型的对向量
- 如何以"union-like"方式更改C++向量的数据类型
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 返回字符串和不同向量数据类型的映射C++
- 如何确定传递给模板函数的向量的类型
- 向量的向量不同类型
- 调用函数时,如何通过向量返回类型
- 更改成员向量的类型
- Int模板中的数组/向量/其他类型
- 与我定义的类的成员有关的c++向量数据类型编译器错误问题
- 从boost mpl向量注册类型