// VectorTest.cpp : 定义控制台应用程序的入口点。
//
#include
#include
#include
#include
#include
using namespace std;
struct sMatrix{
/*3*3 matrix*/
double _line1[3],
_line2[3],
_line3[3];
/** \brief
* 给矩阵里的每个元素赋值为value
* \param value double
* \return void
*
*/
void SetAllElementValue(double value){
for(int i=0; i<3; ++i){
_line1[i] = value;
}
for(int i=0; i<3; ++i){
_line2[i] = value;
}
for(int i=0; i<3; ++i){
_line3[i] = value;
}
}
/** \brief
*
* \param value double
* \return 如果矩阵里的每个元素减去参数大于0.00001f,说明矩阵里的元素不等于参数值,返回false,如果比0.00001f小,则返回true
*
*/
bool AllElementsEqualValue(double value){
double d_value = 0.00001f;
double diff = 0.0f;
for(int i=0; i<3; ++i){
diff = abs(_line1[i] - value);
if(diff > 0 && diff > d_value){
return false;
}
}
for(int i=0; i<3; ++i){
diff = abs(_line2[i] - value);
if(diff > 0 && diff > d_value){
return false;
}
}
for(int i=0; i<3; ++i){
diff = abs(_line3[i] - value);
if(diff > 0 && diff > d_value){
return false;
}
}
return true;
}
double (*ConvertTo2DArray(double ary[][3]))[3]{
if(ary == NULL){
return NULL;
}
for(int i=0; i<3; ++i){
(*(ary+0))[i] = _line1[i];
}
for(int i=0; i<3; ++i){
(*(ary+1))[i] = _line2[i];
}
for(int i=0; i<3; ++i){
(*(ary+2))[i] = _line3[i];
}
return ary;
}
};
int main()
{
/*
这里的100为你vector里实际要存的数量,先给定一个大小的好处是,可以优化vector的执行速度.
而且这样一来,vector里直接就有了你申请的指定数量的元素
*/
std::vector _matrix_vec(100);
/*检查vector里现有的元素的数量*/
printf("there are %d elements in vector.\n", _matrix_vec.size());
/*
例如:直接改变vector里第5个元素的值
vector下标从0开始,第五个也就是下标为4的元素
*/
_matrix_vec[4]._line1[0] = 1.1f;
_matrix_vec[4]._line1[1] = 2.2f;
_matrix_vec[4]._line1[2] = 3.3f;
/*显示第五个元素第一行的值*/
printf("(%0.2f,%0.2f,%0.2f)\n", _matrix_vec[4]._line1[0], _matrix_vec[4]._line1[1], _matrix_vec[4]._line1[2]);
/*插入一个值*/
sMatrix tmpMatrix = {0.0f};
tmpMatrix._line1[0] = 1.0f;
tmpMatrix._line2[1] = 2.1f;
tmpMatrix._line3[2] = 3.2f;
_matrix_vec.push_back(tmpMatrix);
/*显打印插入的值,因为_matrix_vec.push_back函数是插入到vector最后的,所以因为取vector的大小-1*/
int tmpLastElement = _matrix_vec.size() - 1;
printf("(%0.2f,%0.2f,%0.2f)\n", _matrix_vec[tmpLastElement]._line1[0], _matrix_vec[tmpLastElement]._line2[1], _matrix_vec[tmpLastElement]._line3[2]);
/*检查vector里是不是多一个元素*/
printf("there are %d elements in vector.\n", _matrix_vec.size());
/*
vector遍历
遍历方法有2种,一种是直接引用下标,还有一种是迭代器。
下标操作参见上面的使用方法,下面使用迭代器操作,查找一个元素全部为1的矩阵,找到第一个符合条件的就返回。
先在vector里创建一个元素全部为一的矩阵
*/
/*设置vector里第67个矩阵的所有元素为1.0f*/
_matrix_vec[66].SetAllElementValue(1.0f);
/*定义迭代器查找*/
std::vector::iterator tmpBegin = _matrix_vec.begin();
for(int tmpPos = 0; tmpBegin != _matrix_vec.end(); ++tmpBegin, ++tmpPos){
/*
必须对迭代器解引用才能是真正的元素。
WARNING:
在循环里使用迭代器特别要注意的是循环移除元素,必须保存指向下一个元素的迭代器才能移除当前迭代器,
如果对当前迭代器使用了移除,而后对该迭代器使用++功能,则会导致错误,因为在移除的时候,就已经使
迭代器无效
*/
if((*tmpBegin).AllElementsEqualValue(1.0f)){
printf("I find the %dth element that all elements of matrix are 1.0f.\n", tmpPos);
break;
}
}
/*
如果要移除vector里的某个元素,可以使用_matrix_vec.pop_back,这个方法只能移除vector里最后一个元素,这个不在举例。
也可以用迭代器找到相应的元素后,使用移除功能,如移除刚刚找到的元素:
*/
_matrix_vec.erase(tmpBegin);
/*检查vector里的元素的个数*/
printf("there are %d elements in vector.\n", _matrix_vec.size());
/*把sMatrix转换为3*3的矩阵*/
double tmpArrray[3][3] = {0.0f};
_matrix_vec[4].ConvertTo2DArray(tmpArrray);
/*查看矩阵内容*/
for(int i=0; i<3; ++i){
printf("(%0.2f,%0.2f,%0.2f)\n", tmpArrray[i][0], tmpArrray[i][1], tmpArrray[i][2]);
}
system("pause");
return 0;
}