[英]Generic vector of vectors in C++
在C ++中,有沒有一種很好的方法來實現(或偽造)矢量的通用矢量的類型?
忽略何時使用向量向量是個好主意(除非有等效的東西總是更好)。 假設它確實對問題進行了正確建模,並且矩陣沒有對問題進行正確的建模。 還要假設以這些東西為參數的模板化函數確實需要操縱結構(例如,調用push_back),因此它們不能僅采用支持[][]
的泛型類型。
我想做的是:
template<typename T>
typedef vector< vector<T> > vecvec;
vecvec<int> intSequences;
vecvec<string> stringSequences;
但這當然是不可能的,因為無法將typedef模板化。
#define vecvec(T) vector< vector<T> >
這是很接近的,可以避免在vecvecs上運行的每個模板化函數之間重復類型,但是在大多數C ++程序員中並不流行。
您想要有template-typedefs。 那還不支持在當前的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 。
高溫超導
您可以簡單地創建一個新模板:
#include <string>
#include <vector>
template<typename T>
struct vecvec : public std::vector< std::vector<T> > {};
int main()
{
vecvec<int> intSequences;
vecvec<std::string> stringSequences;
}
如果這樣做,您必須記住vector的析構函數不是虛擬的,並且不要執行以下操作:
void test()
{
std::vector< std::vector<int> >* pvv = new vecvec<int>;
delete pvv;
}
您可以使用std::vector
作為基礎來實現基本的vector-of-vector類型:
#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;
}
它只是一個模擬矩陣的非常簡單的容器(只要用戶承諾,可以通過改進vecvec定義或通過適當使用矩形來實現)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.