精华内容
下载资源
问答
  • 工作那么长时间stl容器很少去存储简单类型,一般都是利用stl容器的特性,去存储复杂类型,比如:类对象、结构体.... 0x01 实例操作 class CheckInfo { public: CheckInfo(std::string _strTime, std::string ...

    0x00 唠唠叨叨

    工作那么长时间stl容器很少去存储简单类型,一般都是利用stl容器的特性,去存储复杂类型,比如:类对象、结构体....


    0x01 实例操作

    class CheckInfo
    {
    public:
    	CheckInfo(std::string _strTime, std::string _token)
    	{
    		if (!_strTime.empty())
    		{
    			this->m_time = _strTime;
    		}
    
    		if (!_token.empty())
    		{
    			this->m_token = _token;
    		}
    	}
    
    	//m_time get/set函数
    	bool SetTime(const std::string& _time)
    	{
    		if (_time.empty())
    		{
    			return false;
    		}
    
    		this->m_time = _time;
    		return true;
    	}
    
    	std::string GetTime()
    	{
    		return this->m_time;
    	}
    
    	//m_token get/set函数
    	bool SetToken(const std::string& _token)
    	{
    		if (_token.empty())
    		{
    			return false;
    		}
    
    		this->m_token = _token;
    		return true;
    	}
    
    	std::string GetToken()
    	{
    		return this->m_token;
    	}
    
    private:
    	std::string m_time;
    	std::string m_token;
    };
    

    int main(int argc, char* argv[])
    {
    	vector<CheckInfo*> info;
    	
    	CheckInfo phoneInfo("2017年11月14日 07:29:07","reacher123");
    	CheckInfo personInfo("2017年11月14日 07:29:07", "123reacher");
     
    	info.push_back(&phoneInfo);
    	info.push_back(&personInfo);
    
    	/*  根据vector的特性,使用数组的方式得到存储在vector内部的对象地址,
    		再使用指针指向实例对象的堆空间,
    		然后调用实例对象的函数
    	*/
    	cout << (*info[0]).GetTime()  << endl;
    
    	return 0;
    }



    0x02 使用到的姿势点

    为了方便不了解的朋友方便学习,罗列了一下使用到的知识点

    vector 的特性,数组,指针,类,堆空间申请

     
    0x03 遇到的bug

    昨天上班到太晚了,起床有点头晕,在#include "stdafx.h"定义了抽象类,晕乎乎又写了一边,搞成了重复定义,晕了一会才看错误提醒,出现问题记得一定要先看错误提示,根据错误提示再看代码上下文,就可能大致推断出bug出现的原因和定位到bug的位置。


    展开全文
  • 其他类型的vector存储方式前面我们一直都是介绍的vector用来装int类型的数组,那么既然是容器,就不可能只能装一种东西,我们就举个实例来看看vector怎么装其他的类型的数据:#include #include <vector> #include ...

    其他类型的vector存储方式

    前面我们一直都是介绍的vector用来装int类型的数组,那么既然是容器,就不可能只能装一种东西,我们就举个实例来看看vector怎么装其他的类型的数据:

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    void outputValue(vector<string> vec);
    int main() {
        vector<string> vec;
        vec.push_back("hello");
        vec.push_back("dear");
        vec.push_back("redAnt");
        outputValue(vec);
        return 0;
    }
    void outputValue(vector<string> vec) {
        for(int i = 0; i < vec.size(); i++){
            cout << vec[i] << " " ;
        }
        cout << endl; 
    }

    此时的存储是这样的

    “hello”
    0

    他们的对应的下标就是0 1 2,所以vec[1] = “dear”;我们也可以通过输出看出来:
    这里写图片描述

    而char类型就类似了。

    vector排序

    其实这只是一种用法,我们导入头文件,利用里面的方法就可以了,具体里面的排序是怎么样的,我们以后在排序算法里讲解。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    void outputValue(vector<int> vec);
    int main() {
        vector<int> vec;
        for(int i = 0; i <= 9; i++) {
            int a;
            cin >> a;
            vec.push_back(a);
        }
        cout << "顺序排序" << endl; 
        sort(vec.begin(), vec.end());
        outputValue(vec);
        cout << "逆序排序" << endl; 
        reverse(vec.begin(),vec.end());
        outputValue(vec);
        return 0;
    }
    void outputValue(vector<int> vec) {
        for(int i = 0; i < vec.size(); i++){
            cout << vec[i] << " " ;
        }
        cout << endl; 
    }

    结果:

    展开全文
  • [C++]vector存储方式和自增长问题

    千次阅读 2013-06-01 17:55:42
    我们知道,顺序容器vector为了支持快速的随机访问,使用了连续的方式存放每一个元素 因为元素的连续存储的,如果要在vector中插入一个元素,假设容器已没有空间存放新的元素,那就必须要另外找一块连续的空间,将旧...

    我们知道,顺序容器vector为了支持快速的随机访问,使用了连续的方式存放每一个元素

    因为元素的连续存储的,如果要在vector中插入一个元素,假设容器已没有空间存放新的元素,那就必须要另外找一块连续的空间,将旧元素copy到新空间中,并且把新元素插入到新空间的末尾

    实际上,为了使vector实现快速的内存分配,实际分配的空间会比当前需要的空间多一些,vector预留了额外的存储区,用于存放新的元素


    比如当前vector的size为30,实际分配的空间往往会大于30,

    vector<int> v;
    for (int i=0; i!=30; ++i)
    {
    	v.push_back(i);
    
    }
    
    cout<<"size="<<v.size()<<endl;cout<<"capacity="<<v.capacity()<<endl;
    
    
    
    

    
    
    
    

    如果再往此vector中插入元素,则一开始会使用预先分配到内存,也就是不需要重新分配,这样的本质是一次分配一块较大的空间,可以节省分配和复制元素的消耗,往往性能也比较高


    正因为实现vector的时候,对此做了优化,所以我们往往更喜欢使用vector而不是list,当然,这也需要看使用的场景,list更适合在需要随机插入和删除元素的场景,如果不需要,往往使用vector更合适


    同时,vector的这种存储机制也可能会出现问题,当机器内存没有办法分配vector需要的较大的连续的存储空间时,就会导致分配失败,并且抛出一个异常,而list却不一定


    假设,内存还有100,连续的空间有10,30,50,10,如果使用vector,需要连续的空间80,则会分配失败,而使用list,则不会有这个问题,list并不要求使用连续的空间

    当然,如果vector和list需要空间120,则用哪一种方式都会导致分配失败


    这里写这么多,只是想说明并不一定vector就更适合顺序访问,list更适合随机删除/插入,有时候还需要考虑机器的内存和实际的使用场景,只有了解好了容器本身的实现机制,才能更好的使用它们

    
    
    
    
    展开全文
  • 文章目录图像在内存中的存储方式Mat转Vector类型Vector转Mat 图像在内存中的存储方式 Mat - 基本图像容器:Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有...

    图像在内存中的存储方式

    Mat - 基本图像容器:Mat是一个,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。因此,当在程序中传递图像并创建拷贝时,大的开销是由矩阵造成的,而不是信息头。OpenCV是一个图像处理库,囊括了大量的图像处理函数,为了解决问题通常要使用库中的多个函数,因此在函数中传递图像是家常便饭。同时不要忘了我们正在讨论的是计算量很大的图像处理算法,因此,除非万不得已,我们不应该拷贝 大 的图像,因为这会降低程序速度。其思路是让每个 Mat 对象有自己的信息头,但共享同一个矩阵。这通过让矩阵指针指向同一地址而实现。而拷贝构造函数则 只拷贝信息头和矩阵指针 ,而不拷贝矩阵

    需要注意

    • OpenCV函数中输出图像的内存分配是自动完成的(如果不特别指定的话)。
    • 使用OpenCV的C++接口时不需要考虑内存释放问题。
    • 赋值运算符和拷贝构造函数( ctor )只拷贝信息头。
    • 使用函数 clone() 或者 copyTo() 来拷贝一副图像的矩阵。

    对于二维多通道图像,首先要定义其尺寸,即行数和列数。
    然后,需要指定存储元素的数据类型以及每个矩阵点的通道数。为此,依据下面的规则有多种定义

    CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
    

    比如 CV_8UC3 表示使用8位的 unsigned char 型,每个像素由三个元素组成三通道。预先定义的通道数可以多达四个。 Scalar 是个short型vector。指定这个能够使用指定的定制化值来初始化矩阵。比如常用格式Unsigned 8bits包括CV_8UC1,CV_8UC2,CV_8UC3。(最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3),而float 是32位的,对应CvMat数据结构参数就是:CV_32FC1,CV_32FC2,CV_32FC3double是64bits,对应CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3等。

    图像为灰度图像时,存储如下图:
    在这里插入图片描述
    图像为多通道的BGR图像时,存储如下图:
    在这里插入图片描述多通道时矩阵中的列会包含多个子列,其子列个数与通道数相等。图像中的各行就能一行一行地连接起来,形成一个长行。

    Mat转Vector类型

    在多通道BGR图像中,BGR图像的一个像素由以B,G,R顺序的三个字节组成,即三通道(如上图)。

    vector<vector<unsigned char> > Mat2Vector(Mat img)   //img Mat类型
    {
    	int w = img.cols * img.channels();     //可能为3通道,宽度要乘图片的通道数
    	int h = img.rows;
    
    	vector<vector<unsigned char> > array(h, vector<uchar>(w));   //二维vector
    	for (int i = 0; i < h; i++)
    	{
    		uchar* inData = img.ptr<uchar>(i); //ptr为指向图片的行指针,参数i为行数
    		for (int j = 0; j < w; j++)
    		{
    			array[i][j] = inData[j];
    		}
    	}
    	return array;
    }
    
    

    Vector转Mat

    void Vector2Mat(vector< vector<unsigned char> > src, Mat& dst, int type)
    {
    	Mat temp(src.size(), src.at(0).size(), type);
    	for (int i = 0; i < temp.rows; ++i)
    		for (int j = 0; j < temp.cols; ++j)
    			temp.at<unsigned char>(i, j) = src.at(i).at(j);
    	temp.copyTo(dst);
    }
    

    在这里插入图片描述

    展开全文
  • 图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M。对于稀疏图来说,M要远远小于N2 模板如下: struct edge{ int u,v,w,next; }edge...
  • //通过代码实现获取key-value,用vector方式存储。 //【有错误或更好的方法,请大神指点或者给资源网址,方便我学习改善,谢谢】 #include #include #include #include #include #include extern...
  • 然后现在来总结一下图的存储方式。 图的分类有很多,这里不再赘述。 来看一个一般的无向图:通俗地讲,一张图是由边、顶点集构成,每条边上可能还会有相应的边权(带权的),这里讲带权的。 然后想我们怎样存储...
  • Vector分析

    2016-09-28 14:31:32
    其实ArrayList与Vector存储方式相同,底层都是使用对象数组进行存储,但是 ArrayList查询优于Vector,但是ArrayList是非线程安全的,如果考虑多线程时,会选择使用Vector存储。  看一段案例:   使用了List...
  • C++ 的Vector增长方式

    2015-08-04 20:55:25
    vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续...
  • 利用vector进行图的存储

    千次阅读 2018-03-30 09:26:57
    图的存储有多种方式,我个人比较常用的就是邻接矩阵(存储方式是用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组存储图中的边或者弧的信息),优点就是构建起来比较方便,而且我们也可以比较方便的...
  • ArrayList 和Vector 他们的底层实现都是一样的,都是使用数组的方式存储数据 此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以...
  • 1. 软件版本 ...在使用Spark时,有时需要存储DataFrame数据到Hive表中,一般的存储方式如下: // 注册临时表 myDf.registerTempTable("t1") // 使用SQLContext从临时表创建Hive表 sqlConte...
  • STL中vector的数据存储

    2015-01-12 05:20:33
    vector的数据在内存中和普通数组结构相同,都是连续紧密的,记录数组首地址的方式可以是: vectora; int* pa = &a[0]; 测试程序: //=======================================================  // WHJ's ...
  • vector容器是C++中的一种顺序容器,为了支持快速的随机数访问,vector容器以连续的方式存储——也就是一个挨着一个存放。  随机数访问就是当你访问完vec[5],然后可以直接访问vec[13],而不像list,list容器的元素...
  • ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector...
  • ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢Vector...
  •   ArrayList和Vector是采用数组方式存储集合中的元素,元素之间内存地址是连续的。此数组元素数大于实际存储的数据增加和插入新数据,都允许直接序号索引元素,可以快速查找;但是插入和删除数据需要移动数据,...
  • ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便 增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操 作,所以索引数据快而插入数据慢, ...
  • 解答:ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢...
  • PlayerPrefs存储Vector3等结构数据

    千次阅读 2016-03-31 12:43:04
    孙广东 2016.3.31 之前有... 下面就写出两种(都是只能变成字符串)1、json的序列化、反序列化方式JsonFx.Json.JsonReader.Deserialize(data);JsonFx.Json.JsonWriter.Serialize(classObject); 使用了插件: JsonFx.
  • ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector...
  • 初次接触vector的同学可能会因为方便而放弃使用new/delete、malloc/free等动态内存申请方式,当需要用到一个不确定空间大小的变量时,可以直接定义 vector vecINum; vector> vecCName; vector vecMC; 然后通过push_...
  • ArrayList Vector:以数组的方式存储,增、删慢,查、改快 ArrayList:线程不安全,速度快 Vector:线程安全,速度慢(synchoronized) LikedList: 以单链表的方式存储,增、删快,查、改慢 HashMap与Hashtable都实现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,838
精华内容 735
关键字:

vector存储方式