c++ vector的用法,以及二维数组的传递和返回

// VectorTest.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>
#include <vector>
#include <windows.h>
#include <math.h>
#include <stdio.h>

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<sMatrix> _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<sMatrix>::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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值