向量的通用向量在C++中

Ste*_*sop 49 c++ stl

在C++中有一种很好的方法来实现(或伪造)一个通用矢量向量的类型吗?

忽略向量向量是一个好主意的问题(除非有等价的东西总是更好).假设它确实对问题进行了精确建模,并且矩阵不能准确地模拟问题.假设将这些事物作为参数的模板化函数确实需要操纵结构(例如调用push_back),因此它们不能仅仅采用泛型类型支持[][].

我想做的是:

template<typename T>
typedef vector< vector<T> > vecvec;

vecvec<int> intSequences;
vecvec<string> stringSequences;
Run Code Online (Sandbox Code Playgroud)

但当然这是不可能的,因为typedef不能模板化.

#define vecvec(T) vector< vector<T> >
Run Code Online (Sandbox Code Playgroud)

很接近,并且可以保存在vecvecs上运行的每个模板化函数中复制类型,但不会受到大多数C++程序员的欢迎.

Joh*_*itb 51

你想拥有template-typedef.这是被支持在当前的C++.解决方法是做

template<typename T>
struct vecvec {
     typedef std::vector< std::vector<T> > type;
};

int main() {
    vecvec<int>::type intSequences;
    vecvec<std::string>::type stringSequences;
}
Run Code Online (Sandbox Code Playgroud)

在接下来的C++中(由于2010年称为c ++ 0x,c ++ 1x),这将是可能的:

template<typename T>
using vecvec = std::vector< std::vector<T> >;
Run Code Online (Sandbox Code Playgroud)

  • 我认为他们也已经确定了对>>的空间需求 (13认同)

Rex*_*xar 5

您可以简单地创建一个新模板:

#include <string>
#include <vector>

template<typename T>
struct vecvec : public std::vector< std::vector<T> > {};

int main() 
{
    vecvec<int> intSequences;
    vecvec<std::string> stringSequences;
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你必须记住向量的析构函数不是虚拟的,并且不要做这样的事情:

void test()
{
    std::vector< std::vector<int> >* pvv = new vecvec<int>;
    delete pvv;
}
Run Code Online (Sandbox Code Playgroud)

  • 您将丢失所有方便的 vector&lt;T&gt; 构造函数。您需要定义它们,只需将参数传递给父级即可。一种可能性,但不是一个简单的解决方案。 (4认同)

Łuk*_*ski 5

我使用在boost库中实现的Boost.MultiArray.

HTH