稀疏矩阵则可以用map实现:
template<typename T>
class matrix
{
int row_count;
int col_count;
T default_value;
mutable map<pair<int, int>, T> data;
public:
class value_ref//封装元素引用类型的类,在赋值时可能会向map中添加新的元素或删除元素,取值时会在map中不存在指定行、列号时返回缺省值。
{
map<pair<int, int>, T> & data_ref;
int row_index;
int col_index;
T default_value;
public:
value_ref(map<pair<int, int>, T>& init_data_ref, int init_row_index, int init_col_index, T init_default_value):
data_ref(init_data_ref),
row_index(init_row_index),
col_index(init_col_index),
default_value(init_default_value)
{
}
T& operator = (const T& new_value)
{
if (new_value == default_value)
{
map<pair<int,int>,T>::iterator i = data_ref.find(pair<int, int>(row_index, col_index));
if (i != data_ref.end())
data_ref.erase(i);
}
else
data_ref[pair<int, int>(row_index, col_index)] = new_value;
}
operator T() const
{
map<pair<int, int>, T>::iterator i = data_ref.find(pair<int, int>(row_index, col_index));
if (i == data_ref.end())
return default_value;
else
return i->second;
}
};
matrix(int init_row_count, int init_col_count, T init_default_value):
col_count(init_row_count),
row_count(init_col_count),
default_value(init_default_value)
{}
value_ref get_value(int row_index, int col_index)
{
return value_ref(data, row_index, col_index, default_value);
}
const value_ref get_value(int row_index, int col_index) const
{
return value_ref(data, row_index, col_index, default_value);
}
int get_col_count() const
{
return col_count;
}
int get_row_count() const
{
return row_count;
}
value_ref operator()(int row_index, int col_index)
{
return get_value(row_index, col_index);
}
const value_ref operator()(int row_index, int col_index) const
{
return get_value(row_index, col_index);
}
};