我想创建一个向量载体,其中各个向量可以是不同类型,如下所示:
for epoch in range(epochs):
for iter, data in enumerate(dataset):
model.train(data, epoch)
在这种情况下,n
应该是什么?
我的实际用例:
我有不同数据类型的向量,需要将它们写到磁盘上。每次我向数据集添加一列时,我都不必在各个不同位置指定该列。我希望能够轻松地遍历各列。
答案 0 :(得分:5)
有许多方法可以执行此操作,具体取决于您的情况。这是带有std :: variant:
的变体(双关语)std::vector<int> v1 = { 1, 2, 3 };
std::vector<float> v2 = { 4.5f, 5.5f, 6.5f };
std::vector<double> v3 = { 7.5, 8.5, 9.5 };
std::vector<std::variant<std::vector<int>, std::vector<float>, std::vector<double>>> all;
all.push_back(v1);
all.push_back(v2);
all.push_back(v3);
for(auto& variant : all)
{
std::visit([](const auto& container) {
for(auto value : container)
{
std::cout << value << '\n';
}
}, variant);
}
带有类型擦除的 std::any
也可以使用。或降低一级,f.i。与std::vector<std::variant<int, float, double>>
。
答案 1 :(得分:0)
您无法执行此操作,因为所有3种向量类型都不同。
但是,您可以使用std :: vector所需的必需抽象函数创建一个非模板的抽象类,然后为每种矢量类型实现它。
类似这样的东西:
struct Base
{
int size() = 0;
};
template <typename T>
struct VectorWrapper : public Base
{
std::vector<T>* mVector;
int size() { return mVector.size(); }
};
int main()
{
std::vector<int> v;
// initialize vector
VectorWrapper<int> w;
w.mVector = &v;
std::vector<Base*> all;
all.push_back(&w)
return 0;
}