当我们走完上两讲的时候再来看今天的内容,你们会发现竟是如此的简单的,但是今天我们要说的这个扩展矩阵用处比上一讲我们所说的要大得多大,至少在项目里面我还没去使用上一讲所说的那个储存任意类型元素的容器,今天我们要说的是只会储存一种类型元素的矩阵,由于这个矩阵只会储存一种类型的数据,那么他的实现和上一讲我们说的比起要简单的多,因借用vector就可以很好的实现这个矩阵,但是由于数据的特殊性(不是专门针对矩阵设计的),所以并没有提高那些矩阵的操作方式。
正是由于该矩阵的简单性,所以这个矩阵在项目开发中是我用得最大的,大概是因为我们测试的都是雷达天线的原因,所以数据都是矩阵式分布,所以用这个矩阵类来管理是相当的简便,因为在测试完成后的数据处理过程中会用到各种形式的校准,这是我们要需要能够随时提取某行或者是某一列的数据,然后进行一个操作,然后又会对所有的数据进行数据校准……总之这一切如果按照常规方法去处理很是相当的棘手,然而如果使用该矩阵类来处理数据会变得相当的简单,虽然很简单,我还是将源码放上来,如果有同学想要更多的功能又或者是觉得某些地方实现得不合理,可以改正。
//=====================================================
//===============Matrix================================
template<class T>
class Matrix{
typedef std::vector<T>vector_data;
public:
Matrix(){
m_data.clear();
m_temp_colum.clear();
}
std::vector<vector_data>&
getData(){
return m_data;
}
const std::vector<vector_data>&
getData() const{
return m_data;
}
unsigned colum(unsigned row){
if (m_data.empty())
return 0;
return m_data.at(row).size();
}
void clear(){
m_data.clear();
}
bool empty(){
return m_data.empty();
}
size_t size(){
return m_data.size();
}
T at(unsigned row, unsigned colum){
if (row >= m_data.size())
throw std::runtime_error("
row index beyong range!!!!"
);
if (colum >= m_data.at(row).size())
throw std::runtime_error("
colum index beyong range!!!"
);
return m_data.at(row).at(colum);
}
std::vector<T>getColumdata(unsigned colum){
std::vector<T>result;
result.reserve(m_data.size());
std::for_each(m_data.begin(), m_data.end(), [&
](vector_data data){
if (data.size() <= colum)
result.push_back(T());
else
result.push_back(data.at(colum));
});
return result;
}
std::vector<T>getRowData(unsigned row){
std::vector<T>result;
if (row >= m_data.size()){
throw std::runtime_error("
row index beyong range!!!!!"
);
}
result = m_data.at(row);
return result;
}
void push_back(std::vector<T>&
data){
m_data.push_back(data);
}
//================================
//反正矩阵,纵横反转
//===============================
Matrix<T>
flip(){
Matrix<T>result;
if(m_data.empty()){
return result;
}
//===================================
//检查矩阵所有行数的列数是否相等
//===================================
size_t count = m_data.begin()->size();
for(auto&
it : m_data){
if(count != it.size()){
return result;
}
}
for(int i=0;
i<count;
++i){
result.push_back(getColumdata(i));
}
return result;
}
//======================================
//使用流操作的形式打印矩阵的内容
//======================================
friend std::ostream&
operator<<(std::ostream&
os, const Matrix&
m){
if (m.m_data.empty())
return os;
os <<"
[row:"
<<m.m_data.size() <<"
t"
<<"
first colum:"
<<m.m_data.at(0).size() <<"
]n"
;
std::for_each(m.m_data.begin(), m.m_data.end(), [&
](vector_data data){
std::copy(data.begin(), data.end()-1, std::ostream_iterator<T>(os, "
t"
));
os <<data.at(data.size() – 1)<<std::endl;
});
return os;
}
private:
std::vector<vector_data>m_data;
};
//===========================================================
是吧,这和上一讲的比起来这变得相当的简单,这其实就是vector的vector而已,只是进一步包装了,让使用起来变得更加方便一些。
由于这个类是封装vector的vector,所以使用起来相当简单,这里就不举例了。接下来打算给大家说一下boost的asio库吧,我们主要说说里面的网络库。
//=================================================
回复D查看目录,回复数字查看相应章节
原文始发于微信公众号(
C/C++的编程教室
):第104讲 标准库扩展(3)
|