C ++中向量的通用向量

用C ++来实现(或伪造)一个向量的通用向量的types是否有一个好的方法?

忽略vectorvector何时是好主意的问题(除非有相同的东西总是更好)。 假设它确实对问题build模,并且matrix不能准确地模拟问题。 还假设以这些东西为参数的模板化函数需要操作结构(例如调用push_back),所以它们不能只支持[][]的通用types。

我想要做的是:

 template<typename T> typedef vector< vector<T> > vecvec; vecvec<int> intSequences; vecvec<string> stringSequences; 

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

 #define vecvec(T) vector< vector<T> > 

是接近的,并且可以节省每个在vecvecs上运行的模板化函数的types,但不会被大多数C ++程序员所欢迎。

你想要有模板types定义。 这在目前的C ++中还不被支持。 解决方法是做

 template<typename T> struct vecvec { typedef std::vector< std::vector<T> > type; }; int main() { vecvec<int>::type intSequences; vecvec<std::string>::type stringSequences; } 

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

 template<typename T> using vecvec = std::vector< std::vector<T> >; 

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

HTH

你可以简单地创build一个新的模板:

 #include <string> #include <vector> template<typename T> struct vecvec : public std::vector< std::vector<T> > {}; int main() { vecvec<int> intSequences; vecvec<std::string> stringSequences; } 

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

 void test() { std::vector< std::vector<int> >* pvv = new vecvec<int>; delete pvv; } 

你可以使用std::vector作为基础来实现基本的vector-of-vectortypes:

 #include <iostream> #include <ostream> #include <vector> using namespace std; template <typename T> struct vecvec { typedef vector<T> value_type; typedef vector<value_type> type; typedef typename type::size_type size_type; typedef typename type::reference reference; typedef typename type::const_reference const_reference; vecvec(size_type first, size_type second) : v_(first, value_type(second, T())) {} reference operator[](size_type n) { return v_[n]; } const_reference operator[](size_type n) const { return v_[n]; } size_type first_size() const { return v_.size(); } size_type second_size() const { return v_.empty() ? 0 : v_[0].size(); } // TODO: replicate std::vector interface if needed, like //iterator begin(); //iterator end(); private: type v_; }; // for convenient printing only template <typename T> ostream& operator<<(ostream& os, vecvec<T> const& v) { typedef vecvec<T> v_t; typedef typename v_t::value_type vv_t; for (typename v_t::size_type i = 0; i < v.first_size(); ++i) { for (typename vv_t::size_type j = 0; j < v.second_size(); ++j) { os << v[i][j] << '\t'; } os << endl; } return os; } int main() { vecvec<int> v(2, 3); cout << v.first_size() << " x " << v.second_size() << endl; cout << v << endl; v[0][0] = 1; v[0][1] = 3; v[0][2] = 5; v[1][0] = 2; v[1][1] = 4; v[1][2] = 6; cout << v << endl; } 

这只是一个非常简单的容器,模仿一个matrix(只要用户承诺,通过改进vecvec定义或正确使用矩形形状)。