因为项目使用QVector,太慢了,听说QMap比QVector查找时快,所以写一个小程序试试;

从30000个数据中找5000个

程序运行截图如下:

QVector

QMap

一样的数据,找一样的数代码如下图:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QVector>
#include <QMap>

namespace Ui {
class Widget;
}

typedef struct MyData{
MyData(QString num1,QString num2,QString num3){
m_num1=num1;
m_num2=num2;
m_num3=num3;
}

QString m_num1;
QString m_num2;
QString m_num3;
}MyData;

typedef struct VecData{
VecData(const qint64 num,const QString name){
m_num=num;
m_name=name;
}
qint64 m_num;
QString m_name;

QList<MyData*> m_list;
}VecData;

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();

public slots:
void vectorBtnClicked();
void mapBtnClicked();

private:
Ui::Widget *ui;
QVector<VecData*> m_myVec;
QMap<qint64,VecData*> m_myMap;
qint64 m_num[5000];

};

#endif // WIDGET_H
widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <time.h>
#include <QMessageBox>
#include <QTimer>
#include <QTime>

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("CSDN IT1995");

qint64 data=100000000;
for(qint64 i=0;i<30000;i++){
m_myVec.append(new VecData(data,"这个是name"));
m_myMap.insert(data,new VecData(data,"这个是name"));
for(int j=0;j<100;j++){
m_myVec[i]->m_list.append(new MyData("10000","20000","30000"));
(*m_myMap.find(data))->m_list.append(new MyData("10000","20000","30000"));
}
data++;
}

qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
for(int i=0;i<5000;i++){
m_num[i]=qrand()%100000+100000000;
}

connect(ui->vectorPushButton,&QPushButton::clicked,this,&Widget::vectorBtnClicked);
connect(ui->mapPushButton,&QPushButton::clicked,this,&Widget::mapBtnClicked);
}

Widget::~Widget()
{
delete ui;
}

void Widget::vectorBtnClicked(){

clock_t start,finish;
double totaltime;
start=clock();
for(int i=0;i<5000;i++){
for(int j=0;j<m_myVec.size();j++){
if(m_num[i]==m_myVec[j]->m_num){
qDebug()<<"Value:"<<m_myVec[j]->m_num;
break;
}
}
}
finish=clock();
totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
qDebug()<<"此程序的运行时间为"<<totaltime<<"秒!";
QMessageBox::information(this,"提示","使用了"+QString::number(totaltime,'f',5)+"秒");
}

void Widget::mapBtnClicked(){

clock_t start,finish;
double totaltime;
start=clock();
for(int i=0;i<5000;i++){
qDebug()<<"Value:"<<(*m_myMap.find(m_num[i]))->m_num;
}
finish=clock();
totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
qDebug()<<"\n此程序的运行时间为"<<totaltime<<"秒!";
QMessageBox::information(this,"提示","使用了"+QString::number(totaltime,'f',5)+"秒");
}
main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();

return a.exec();
}
 
---------------------
作者:草莓蛋糕人
来源:CSDN
原文:https://blog.csdn.net/u014746838/article/details/83504246
版权声明:本文为博主原创文章,转载请附上博文链接!

QVector与QMap查找效率实战(QMap快N倍,因为QVector是数组,QMap是有序二叉树,查找的时候是N和LogN的速度对比)的更多相关文章

  1. 何在mysql查找效率慢的SQL语句?

    如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启 ...

  2. List和Dictionary泛型类查找效率浅析

    List和Dictionary泛型类查找效率存在巨大差异,前段时间亲历了一次.事情的背景是开发一个匹配程序,将书籍(BookID)推荐给网友(UserID),生成今日推荐数据时,有条规则是同一书籍七日 ...

  3. python 字典有序无序及查找效率,hash表

    刚学python的时候认为字典是无序,通过多次插入,如di = {}, 多次di['testkey']='testvalue' 这样测试来证明无序的.后来接触到了字典查找效率这个东西,查了一下,原来字 ...

  4. MySQL数据库中的字段类型varchar和char的主要区别是什么?哪种字段查找效率要高?

    1,varchar与char的区别?(1)区别一,定长和变长,char表示定长,长度固定:varchar表示变长,长度可变.当插入字符串超出长度时,视情况来处理,如果是严格模式,则会拒绝插入并提示错误 ...

  5. python中in在list和dict中查找效率比较

    转载自:http://blog.csdn.net/wzgbm/article/details/54691615 首先给一个简单的例子,测测list和dict查找的时间: ,-,-,-,-,,,,,,] ...

  6. 基于Python实现二分查找法实战

    二分查找法实战 def binary_search(datasets, find_in): mid = int(len(datasets)/2) if(mid>0): if(find_in> ...

  7. 实战-DRF快速写接口(认证权限频率)

    实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...

  8. grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)

    这篇长文历时近两天终于完成了,前两天帮网站翻译一篇文章“为什么GNU grep如此之快?”,里面提及到grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解 ...

  9. grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)(转)

    这篇长文历时近两天终于完成了,前两天帮网站翻译一篇文章“为什么GNU grep如此之快?”,里面提及到grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解 ...

随机推荐

  1. Java如何对一个对象进行深拷贝?

    在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝.浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化.而深拷贝则是拷贝了源对象的所有值,所以即 ...

  2. koa 基础(十五)cookie 设置中文

    1.app.js // 引入模块 const Koa = require('koa'); const router = require('koa-router')(); /*引入是实例化路由 推荐*/ ...

  3. Git clone 报错 128

    使用tortoiseGit检出项目是报错,错误代码128: 使用git bash检出相同目录时返回 git clone fatal:destination path already exists an ...

  4. Php+Redis函数使用总结

    因项目需求,冷落了redis,今天再重新熟悉一下: <?php //连接 $redis = New Redis(); $redis->connect('127.0.0.1','6379', ...

  5. C#汉字转换拼音技术详解(高性能)

    public static class ChineseToPinYin { private static readonly Dictionary<<span class="key ...

  6. win + T 快捷键

    和 alt + tab 不同,win + T会在 在任务栏间的程序间进行switch

  7. asp.net core mvc View Component 应用

    ViewComponent 1.View 组件介绍 在ASP.NET CORE MVC中,View组件有点类似于partial views,但是他们更强大,View组件不能使用model bindin ...

  8. Hibernate对象的状态分类

    对象的状态: 临时状态Transient: 与数据库没有对应,跟Session没有关联 一般是新new出的对象 持久化状态Persistent: 对象在Session的管理之中,最终会有对应的数据库记 ...

  9. js 闭包解决方案

    相比很多人都遇见过这样的情况: 给一个ul的所有li绑定行为,在点击时获取其index. 假设结构如下: <body> <ul> <li>0</li> ...

  10. JavaScript数值千分位格式化的方法和性能

    瞎掰的前提 前端嘛,经常处理数值和时间. 所以数值和时间的格式化少不了. 最近一直在面试前端, 就出了一个如何给数值添加千分位的面试题. 至于答案,我一直都有一种标准, 一是基于你现有的知识可以实现, ...