电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
如何在Qt中使用容器vector
分 享
扫描二维码分享
如何在Qt中使用容器vector
Qt
vector
容器
大斯
关注
发布时间: 2020-04-20
丨
阅读: 1200
# 前言 这篇文章其实还是为读取dxf文件服务的,我可不想只是简单输出得到的数据,所以就用到了vector来存储数据。嘻嘻,蛮好玩的,记录一下!!! ## 什么是vector? 我们把vector称为容器,是因为它可以包含其他的对象。实际上,它被翻译为向量,你可以把它简单理解为不需要定义大小,可以根据需要自动扩充的数组。但是它存储的对象必须类型相同。 ## vector的定义和初始化 要在程序中使用vector的话,需要包含头文件: ***#include
using namespace std;*** ------------ 它的定义也很简单: ***vector
name; //整型 vector
name; //双精度型 vector
name; //浮点数型 vector
name; //字符型 vector
> name; //类似二维数组*** ------------ 初始化: ***vector
a; //声明整型向量 vector
a(10); //声明了10个整型元素的向量 vector
a(10,1); //声明了10个整型元素的向量,且每个元素的初值为1 vector
b(a); //声明并用向量a初始化向量b*** ------------ ## vector的使用 对象的读取 通过下标方式: ***vector
v; cout<
::iterator it; vector
::iterator it; vector
::iterator it;*** ------------ 对象的常用操作 假设我们定义了向量a ***a.back() //返回a的最后一个对象 a.front() //返回a的第一个对象 a.clear() //清空a的对象 a.empty() //判断a是否为空 a.pop_back() //删除a的最后一个对象 a.erase(a.begin(),a.begin()+3) //删除a中的第0个到第2个对象 a.push_pack() //在a的最后插入一个对象 a.insert(a.begin(),5) //在a的第0个对象的位置插入5 a.insert(a.begin(),3,5) //在a的第0个对象的位置插入3个数,其值都为5 a.size() //返回a的对象的个数 a.capacity() //返回a在内存中总共可以容纳的对象的个数 a.resize(10) //将a的现有对象个数调至10个 a.swap(b) //b为向量,将a、b中的对象进行整体性交换*** ## 实例 前言中提过学习vector是为了存储之前从dxf文件中读取到的数据,那么我们不妨来操作一下 首先我们应该新建一个文件,头文件包含vector和opencv ![](https://cf03.ickimg.com/bbsimages/202004/883bc984f0a224ae9a9a395219255422.png) 然后定义线,圆,多线实体,圆弧,文字对象的类 ```cpp //线对象 class DXFLine { public: Point2f beginpoint; Point2f endpoint; }; //圆对象 class DXFCricle { public: Point2f centerpoint; double radius; }; //多线实体对象 class DXFPolyLineEntities { public: vector
vertex; bool isclose; }; //圆弧对象 class DXFArc { public: Point2f centerpoint; double radius; double bangle; double eangle; }; //文字对象 class DXFText { public: Point2f insertionpoint; Point2f alignmentpoint; double height; double sScaleFactor; int textGennrationFlags; int hJustification; int vJustification; string m_text; string style; double angle; }; ``` 然后定义一个块对象类,来存放dxf的块对线,世界坐标、缩放比例、线、圆、多线实体、圆弧、文字对象 ```cpp class BlockObj { public: BlockObj() { sx = 1; sy = 1; sz = 1; ipx = 0; ipy = 0; ipz = 0; line.clear(); } ~BlockObj(){} //块名称 string name; //缩放比例 double sx; double sy; double sz; //用户坐标系相在世界坐标系中的位置 double ipx; double ipy; double ipz; vector
line; vector
circle; vector
polylineentities; vector
arc; vector
text; bool drawflag; }; ``` 建好了容器以后我们就可以往里面存入数据了,大家可以去翻看上篇文章,我们重写了虚函数来获取dxf的数据,之前是直接输出的,现在我们把这些数据存入vector中。 在test_creationclass.h文件中添加块对象的定义, ```cpp vector
myblock; ``` 添加函数定义 ```cpp //插入对象 virtual void addInsert(const DL_InsertData& data); //插入块 virtual void addBlock(const DL_BlockData& data); virtual void endBlock(); ``` 在test_creationclass.c的构造函数中先插入一个空块,这里用到了**push_back()** ```cpp Test_CreationClass::Test_CreationClass() { BlockObj newblock; newblock.drawflag = true; newblock.name = "entities"; myblock.push_back(newblock); //插入一个块 } ``` 然后在虚函数中保存数据,以Line对象为例,其他的对象类类似 ```cpp void Test_CreationClass::addLine(const DL_LineData& data) { DXFLine myline; myline.beginpoint = Point2f(data.x1,data.y1); myline.endpoint = Point2f(data.x2,data.y2); myblock[myblock.size() - 1].line.push_back(myline); } ``` 插入对象、块的函数 ```cpp void Test_CreationClass::addText(const DL_TextData &data) { DXFText myText; myText.insertionpoint = Point2f(data.ipx,data.ipy); myText.alignmentpoint = Point2f(data.apx,data.apy); myText.height = data.height; myText.m_text = data.text; myText.style = data.style; myText.hJustification = data.hJustification; myText.vJustification = data.vJustification; myblock[myblock.size()-1].text.push_back(myText); } void Test_CreationClass::addInsert(const DL_InsertData& data) { vector
::iterator itor; itor = myblock.begin(); while(itor != myblock.end()) { if(!itor->name.compare(data.name)) { itor->ipx = data.ipx; itor->ipy = data.ipy; itor->ipz = data.ipz; itor->sx = data.sx; itor->sy = data.sy; itor->sz = data.sz; itor->drawflag = true; break; } itor++; } } void Test_CreationClass::addBlock(const DL_BlockData& data) { myblock[myblock.size() - 1].name = data.name; myblock[myblock.size() - 1].drawflag = false; } void Test_CreationClass::endBlock() { BlockObj newblock; newblock.drawflag = true; newblock.name = "entities"; myblock.push_back(newblock); } ``` OK,这样数据就存起来了,绘制的时候只要读取vector中的对象就可以了。 注:代码中的<指的是"<",>指的是">"。显示总是有错误
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
大斯
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交