QT数据类型和容器用法

Qt库提供了基于通用模板的容器类, 这些类可用于存储指定类型的数据项,Qt中这些容器类的设计比STL容器更轻,更安全且更易于使用。容器类也都是隐式共的,它们是可重入的,并且已针对速度/低内存消耗和最小的内联代码扩展进行了优化,从而生成了较小的可执行文件。
容器类是基于模板的类,例如常用的QList<T>,T是一个具体的类,可以是int,float等简单类,也可以是QString、QDate类。T必须是一个可赋值的类型,即T必须提供一个默认构造函数,一个可复制的构造函数和一个赋值运算符。Qt的容器分为关联容器类和关联容器类, 顺序容器有:QList,QLinkedList,QVector,QStack和QQueue。
• QList是最适合使用的类型。它是作为数组列表实现的,提供了非常快的前置和追加操作。
• 如果需要一个链表,使用QLinkedList。
• 如果希望项目占据连续的内存位置,请使用QVector。
• QStack和QQueue是提供LIFO和FIFO语义的便捷类。

一,QT数据类型

QT基本数据类型定义在<QtGlobal>头文件中,QT基本数据类型

QT函数和宏定义,申明的宏使程序员能够向其应用程序添加编译器或平台特定的代码,而其他
宏则是用于较大操作的便捷宏, 比如Q_PROCESSOR_ARM,定义是否为ARM处理器编译应用
程序,Qt当前支持可选的ARM版本Q_PROCESSOR_ARM_V5,Q_PROCESSOR_ARM_V6和Q_PROCESSOR_ARM_V7。

返回值         函数                                 含义
T             qAbs(const T &t)                     绝对值函数
const T &     qMax(const T &a, const T &b)         检索两个给定对象的最大值
const T &     qMin(const T &a, const T &b)         检索两个给定对象的最小值

 1, QString:

它存储16位Unicode字符,字符串和数值之间的转换:

QString str7 = "56.5";
qDebug()<<str7.toInt();
qDebug()<<str7.toDouble();

qDebug()<<str7.toFloat();
qDebug()<<str7.toLong();
qDebug()<<QString::number(53);
qDebug()<<QString::number(4.4156);
qDebug()<<QString::number(4.4156,'f',2);
QString str8 = "F0F0";
bool OK;
int val = str8.toInt(&OK,16);
qDebug()<<val;
qDebug()<<QString::number(val,2);
qDebug()<<QString::number(val,8);
qDebug()<<QString::number(val,10);
qDebug()<<QString::number(val,16);


8位字符串和Unicode字符串之间转换,以QByteArray的形式返回字符串
qDebug()<<str8.toLocal8Bit();
qDebug()<<str8.toLatin1();
qDebug()<<str8.toUtf8();

 toLatin1() 返回 Latin-1(ISO 8859-1)编码的8位字符串。
• toUtf8() 返回UTF-8编码的8位字符串。UTF-8是US-ASCII(ANSI X3.4-1986)的超集,它
通过多字节序列支持整个 Unicode 字符集。
• toLocal8Bit() 使用系统的本地编码返回 8 位字符串。
QString 也提供了 fromLatin1(),fromUtf8() 和 fromLocal8Bit() 对应的转换函数。
字符串的拆分和拼接,除了前面提到的append(),prepend(),insert(),replace()和remove(),indexOf()或lastIndexOf() 以及trimped()和simplified()。

2, QStringList

QStringList继承自QList<QString>,提供字符串列表,QList的所有功能也适用于QStringList。例如
可以使用 isEmpty() 测试列表是否为空,并且可以调用诸如append(),prepend(),insert(),replace(),removeAll(),removeAt(),removeFirst(),removeLast()和removeOne()之类的函数来修QStringList。QStringList提供了一些便利功能,这些功能使处理字符串列表更加容易:通过insert() append()或者重载的operator+=() 和 operator «()将字符串添加到列表中

QStringList fonts = { "Arial", "Helvetica", "Times" };
fonts << "Courier" << "Verdana";
fonts += "chinese";
for (int i = 0; i < fonts.size(); ++i)
{
    qDebug()<< fonts.at(i).toLocal8Bit().constData();
}
QStringListIterator javaStyleIterator(fonts);
while (javaStyleIterator.hasNext())
{
    qDebug() << javaStyleIterator.next().toLocal8Bit().constData();
}
QStringList::const_iterator constIterator;
for(constIterator=fonts.constBegin(); constIterator!=fonts.constEnd();,++constIterator)
{
    qDebug() << (*constIterator).toLocal8Bit().constData();
}

3,QByteArray

QByteArray用于存储原始字节(包括’0’和传统的以’0’结尾的 8 位字符串)。使用QByteArray比使用const char*更为方便。QByteArray在主要以下两种情况中使用:需要存储原始二进制数据时和在内存保护至关重要。QByteArray可以包含“0”, rize()函数总会计算”0”,但是date()和constData()返回结果总是以”0”作为结束标志:

qDebug()<<byte.right(2);
qDebug()<<byte.left(2);
qDebug()<<byte.mid(2,2);
QByteArray byte1("ca\0r\0t");
qDebug()<<byte1.size(); // Returns 2.
qDebug()<<byte1.data();
qDebug()<<byte1.constData(); // Returns "ca" with␣

QByteArray byte2("ca\0r\0t", 3);
qDebug()<<byte2.size(); // Returns 3.
qDebug()<<byte2.constData(); // Returns "ca\0" with,→terminating \0.
QByteArray byte3("ca\0r\0t", 4);
qDebug()<<byte3.size(); // Returns 4.
qDebug()<<byte3.constData(); // Returns "ca\0r" with␣terminating \0.
for(int i=0; i<byte3.size();i++)
{
    qDebug()<<byte3.at(i);
}
const char cart[] = {'c', 'a', '\0', 'r', '\0', 't'};
QByteArray byte4(QByteArray::fromRawData(cart, 6));
qDebug()<<byte4.size(); // Returns 6.
qDebug()<<byte4.constData(); // Returns "ca\0r\0t" without␣terminating \0.

resize()可以重新设置数组的大小,并按字节数重新初始化数据字节。QByteArray使用基于0的
索引,就像C++数组一样,可以使用operator[]访问特定索引位置的字节,如果只读,我们也可以使用at()访问指定的字节,left()、right()或 mid()则可以一次读取多个字节:

byte.resize(5);
byte[0] = 0x3c;
byte[1] = 0xb8;
byte[2] = 0x64;
byte[3] = 0x18;
byte[4] = 0xca;
qDebug()<<byte;
qDebug()<<byte[3];
qDebug()<<byte[4];
for (int i = 0; i < byte.size();i++) 
{
    qDebug()<<byte.at(i);
}
qDebug()<<byte.right(2);
qDebug()<<byte.left(2);
qDebug()<<byte.mid(2,2);

QByteArray提供用于修改字节数据的基本功能:追加append(),前置添加prepend(),插入
insert(),替代replace()和移除remove()。indexOf()或lastIndexOf()提供查找QByteArray中所有出现的特定字符或子字符串,返回字符或子字符串的索引位置(如果找到的话)。contains()用于检查 QByteArray是否包含特定字符或子字符串,count()则可以用来统计特定字符或子字符串在字节数组中出现的次数。

QByteArray byte5("and");
qDebug()<<byte5;
byte5.prepend("rock ");
qDebug()<<byte5;
byte5.append(" roll");
qDebug()<<byte5;
byte5.replace(5, 3, "&");
qDebug()<<byte5;



QByteArray byte6("We must be <b>bold</b>, very <b>bold</b>");
int j = 0;
while ((j = byte6.indexOf("<b>", j)) != -1) 
{
    qDebug() << "Found <b> tag at index position " << j;
    ++j;
}
if(byte6.contains("b"))
{
    qDebug()<<byte6.count("b");
}

4, QBitArray

QBitArray是一个数组,访问单个位并提供在整个位数组上工作的运算符(AND,OR,XOR和NOT)。

使用testBit()和setBit()访QBitArray中的位比使用operator[]效率更高:

bit.setBit(0, false);
bit.setBit(1, true);
bit.setBit(2, false);
qDebug()<<bit;

QBitArray区分数组null和empty;分别通过isNull()和isEmpty()来判断
isNull()如果此位数组为null,则返回true;否则返回false;
isEmpty()此位数组的大小是否为0,是返回true;否则返回false

qDebug()<<QBitArray().isNull();
qDebug()<<QBitArray().isEmpty();
qDebug()<<QBitArray(3).isNull();
qDebug()<<QBitArray(3).isEmpty();

QBitArray支持位运算

QBitArray bit_x(5);
bit_x.setBit(3, true);// x: [ 0, 0, 0, 1, 0 ]
QBitArray bit_y(5);
bit_y.setBit(4, true);// y: [ 0, 0, 0, 0, 1 ]
bit_x |= bit_y;// x: [ 0, 0, 0, 1, 1 ]
qDebug()<<bit_x<<bit_y;
bit_x &= bit_y;// x: [ 0, 0, 0, 0, 1 ]
qDebug()<<bit_x<<bit_y;

二,连续容器和关联容器

1,QVector:头文件包含#include<QVector>

是对所有数组的封装,例如想创建一个数组,可以写成QVector array(7),也可以写成QVector array,就是说数组大小可以预先定义也可以先不定义。不论是否有定义,都可以使用array.count()或者array.size()获取到数组元素的个数。
QVector使用的是连续的内存空间,针对不改变的对象,即只要求查询,不做插入删除等操作效率高,但是由于自身结构的原因,插入删除甚至包括追加等操作的效率会比QLIst低。

添加元素办法1
	QVector<QString> strArray;
	strArray.append("AAA"); 
添加元素办法2
    QVector<QString> strArray;
    strArray<<"BBB";  //可以这样
    strArray<<"MyName"<<"is"<<"LEO";


插入
    strArray.insert(1,"YYY");
删除
 	strArray.remove(1); //删除第一个元素,从0开始
   	strArray.remove(1,3); //从1开始,删除3个元素
	strArray.pop_back();   // 删除末尾元素    
    strArray.pop_front();   // 删除开始位置元素
替换
    strArray.replace(1,"LED");
末尾追加
    append()


遍历办法1
    QVector<double> vect(2); 
    vect[0] = 1.0; 
    vect[1] = 2.0; 
    for (int i = 0; i < vect.count(); ++i) 
    {
         qDebug() << vect[i]; 
    }
遍历办法2
    QVector vect(2);
    for(auto a = vect.begin(); a != vect.end(); a++)
    {
        qDebug() << *a;
    }
遍历办法3:迭代器
    QVector<QString>::iterator iter;  
    for (iter=strArray.begin();iter!=strArray.end();iter++)  
    {  
	    qDebug() <<  *iter << "\0";
    }  

2,QList

QList是基于数组+链表,即各个节点的 指针不是通过Next来指向,而是通过将各节点的指针存放在一个数组中,遍历通过找到数组中的指向该节点的指针,再通过指针将节点找到. 相比QVector, QList采用的是分散存储,查找效率跟QVector差不多,也可用于插入、删除等操作,所以一般推荐如果不是强制要求使用QVector,优先选择QList。

添加
QList<QString> List;
List << "AAA" <<  "BBB";

List.append("CCC"); //尾部添加
List.push_back("CCC"); 

List.prepend("DDD"); //头部添加
List.push_front("DDD"); 


删除方式1:从列表删除
QString str = List.takeAt(2); //从列表中删除第3个元素,并获取它
删除方式2:从列表删除
List.removeAt(2);//从列表中删除第3个元素
删除方式3:根据内容删除
QList<QString> list;
list << "sun" << "cloud" << "sun" << "rain";
list.removeOne("sun");


改变位置
list.swap(1,3);//交换位置1和位置3的元素
list.move(1,4);//把第一个元素移到第四个元素,其他元素顺移
修改
QList<QString> list;
list << "AAA" << "BBB" << "CCC";
list.replace(1, "DDD");//参数1 元素下标, 参数2 修改的结果值


查找方式1
int index = list.indexOf("mm");//返回该元素的下标值
查找方式2
bool isCon = list.contains("23");//列表是否有某元素 成功返回true 否则false
查找方式3
index = list.count();//列表总元素 同list.length();
index = list.count("AAA");//列表中有几个这样的元素


遍历访问方式1:
for(int i = 0; i < list.size(); ++i) 
{
   //at()操作比操作符[]更快,因为它不需要深度复制
   qDebug() << list[i] << list.at(i) << list.value(i) ;
}
遍历访问方式2:迭代器
QList<QString>::iterator it;
for(it=list.begin(); it!=list.end();++it)
{
    if((*it)== "00")
    {
        it = list.erase(it,it+2);//删除从起始位置到结束位置的元素
    }
    qDebug() << "it" << (*it);
}

3,QLinkedList

基于索引的API比QLinkedList的基于迭代器的API更方便,并且由于其将项存储在内存中的方式,它通常比QVector更快. 但是,如果您需要一个真正的链表,并且要用来保存大量数据和保证在列表中间不断插入时间,迭代器可以迭代项而不是索引,请使用QLinkedList。

添加方式1
QLinkedList<QString> Listl;
List << "AAA" << "BBB" << "CCC";
添加方式2
QLinkedList<QString> List;
list.append("aaa"); //链表尾部插入
list.push_back("aaa"); //链表尾部插入
list.push_front("5");//链表表头插入


删除
QLinkedList<QString> List;
list << "sun" << "cloud" << "sun" << "rain";
list.removeOne("sun");

list.removeFirst();
list.removeLast();
list.clear();


遍历
QLinkedList<QString> list;
list<<"1"<<"2"<<"3"<<"4";
// foreach正序:
QString str;
foreach (str, list)
{
	qDebug() << str;
}	
// 迭代器正序
QLinkedList<QString>::iterator it;
for(it = list.begin(); it != list.end(); ++it)
{
    qDebug() << *it;
}
// 迭代器倒序
QLinkedList<QString>::const_iterator it = list.constEnd();
while (it != list.constBegin())
{
	--it;
	qDebug()<<*it;
}

4,QByteArray

要存储纯二进制数据(raw binary data)(原始数据)或8-bit编码文本字符串就用QByteArray

访问:QByteArray的访问方式有四种:[]、data[]和at()、constData[]。其中[]和data[]为可读可写;at()和constData[]为只读,因此访问用这两种速度较快。
QByteArray ba;
ba.resize(3);
ba[0] = 0x30;
ba[1] = 0x31;
ba[2] = 0x32;
qDebug() << ba.toHex(); //return “303132”



查找
QByteArray x("sticky question");
QByteArray y("sti");
x.indexOf(y);           //returns 0


数据转换
QByteArray ba;
int n = 63;
ba.setNum(n); // ba == “63”
ba.setNum(n, 16); // ba == “3f”


left、right、mid操作
  //left
  QByteArray x("Pineapple");
  QByteArray y = x.left(4);
  // y == "Pine"

  //right
  QByteArray x("Pineapple");
  QByteArray y = x.right(5);
  // y == "apple"

  //mid
  QByteArray x("Five pineapples");
  QByteArray y = x.mid(5, 4);     // y == "pine"
  QByteArray z = x.mid(5);        // z == "pineapples"

5,QSet

基于哈希表实现的一种单值的数学集合的快速查找容器,使用方式与QList相同,但其内元素不会有重复。

插入
struct node  
{  
    int cx;
    QString str;  
}; 
QSet<node> ss;
for(i=0,j=100;i<101;i++,j--)  
{  
    temp.cx = i;  
    temp.cy = j;  
    ss.insert(temp);  
}  


遍历
QSet<node>::iterator iter;
for(iter=ss.begin();iter!=ss.end();++iter)  
{
	qDebug() << iter->cx << "  " << iter->cy;
}

应用举例

// 创建一个字符串类型的集合(QSet)对象,名为 set
QSet<QString> set;
// 向集合中插入字符串"one" 、"three"、"seven"
set.insert("one");
set.insert("three");
set.insert("seven");
// 使用流操作符连续插入字符串"twelve"、"fifteen"、"nineteen" 到集合中
set << "twelve" << "fifteen" << "nineteen";
// 判断集合中是否包含字符串"fifteen",如果包含则输出"set contains fifteen"
if (set.contains("fifteen"))
qDebug()<<"set contains fifteen";
// 使用 foreach 循环遍历集合中的字符串,并输出其值
foreach (const QString &value, set)
qDebug() << value;

6,QStack

QStack是一种基于栈(Stack)的高级数据结构,QStack容器是一种后进先出(LIFO)的数据结构,即最后一个进入堆栈的元素将最先被移除。堆栈是后进先出(LIFO)结构,使用 push()将项目添加到堆栈的顶部,并使用pop()从顶部检索项目。在 top()函数可以访问到的最上方项目而不删除。

// 创建一个整数类型的栈(QStack)对象,名为stack
QStack<int> stack;
// 使用 push() 压入元素
stack.push(1);
stack.push(2);
stack.push(3);
// 使用 top() 查看栈顶元素
qDebug() << "Top element:" << stack.top();
// 使用 size() 查看堆栈大小
qDebug() << "Stack size:" << stack.size();
// 使用 pop() 移除并返回栈顶元素
int poppedValue = stack.pop();
qDebug() << "Popped value:" << poppedValue;
// 使用 isEmpty() 检查堆栈是否为空
qDebug() << "堆栈是否空的:" << (stack.isEmpty() ? "Yes" : "No");
// 使用 operator<< 压入元素
stack << 4 << 5;
// 当栈不为空时执行循环,输出并弹出栈顶的元素
while (!stack.isEmpty())
qDebug() << stack.pop();
qDebug() << "堆栈是否空的:" << (stack.isEmpty() ? "Yes" : "No");

7,QQueue

QQueue类是提供队列的通用容器,队列是先进先出(FIFO)结构。使用enqueue()将项目添加到队列的尾部,并使用dequeue()从项目头检索项目,head()函数提供了访问头项目而不删除数据。QQueue继承自QList,因此可以方便地利用QList的功能实现队列的基本操作。QQueue提供 enqueue(),dequeue()和 head()三个便利功能,实现fifo定义

//创建一个空的 int 型 QQueue 对象,名为 queue
QQueue<int> queue;
//入队
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
//获取队列大小
qDebug() << "队列大小:" << queue.size();
//检查队列是否为空
qDebug() << "队列是否为空:" << queue.isEmpty();
//查看队列的头部元素
qDebug() << "队列的头部元素:" << queue.head();
/出队元素
int firstElement = queue.dequeue();
qDebug() << "出队元素:" << firstElement;
//获取队列中的第一个和最后一个元素
qDebug() << "First element:" << queue.first();
qDebug() << "Last element:" << queue.last();
//检查队列是否包含特定值
qDebug() << "检查队列是否包含特定值 3:" << queue.contains(3);
//出队所有元素
while (!queue.isEmpty())
qDebug() << queue.dequeue();

8,QVariant

QVariant类是Qt的共用体union数据类型,不仅能保存很多Qt类型的值,包括QColor,QBrush,

QFont,QRect,QString及QSize等等,而且能存放Qt的容器类型值. 常用于存储不同的数据类型,可以在接口返回值中广泛使用。

定义一个int类型的QVariant
QVariant vNum(100);
qDebug() << vNum.toInt();


定义一个float类型的QVariant
QVariant vPI(3.14);
qDebug() << vPI.toFloat();


定义一个QString类型的QVariant
QVariant vStr("Hello!");
qDebug() << vStr.toString();


定义一个bool类型的QVariant
QVariant vBool(false);
qDebug() << vBool.toBool();


定义一个QColor类型的
QVariantQColor color = QColor(Qt::yellow);
QVariant vColor(color);
qDebug() << vColor.type();
qDebug() << vColor.value<QColor>();

9,QMultiMap

QMultiMap继承自QMap并对其功能进行了扩展,使其能够存储多个值,多值映射是一种允许使
用同一键的多个值的映射。

// 声明三个 QMultiMap 类型的变量,QMultiMap 是一种可以存储键值对的容器,并且可以存储重
复的键。
QMultiMap<QString, int> map1, map2, map3;
map1.insert("plenty", 100); // 在 map1 中插入键为"plenty",值为 100 的元素
map1.insert("plenty", 2000); // 在 map1 中再次插入键为"plenty",值为 2000 的元
素,这不会覆盖之前的元素,而是在相同键下插入新的元素
qDebug()<<map1.size();
map2.insert("plenty", 5000); // 在 map2 中插入键为"plenty",值为 5000 的元素。
qDebug()<<map2.size();
// 使用 QMultiMap 的 operator+ 将 map1 和 map2 合并,结果存储在 map3 中
// 如果两个 map 中存在相同的键,那么在 map3 中该键对应的值将是两个 map 中该键对应的所有
值的集合
map3 = map1 + map2;
qDebug()<<map3.size();
// 获取在 map3 中键为"plenty" 的所有值,并将这些值存储到列表中
// 然后遍历 valueslist,并输出其中的每个值
QList<int> valueslist = map3.values("plenty");
for (int i = 0; i< valueslist.size(); ++i)
qDebug() << valueslist.at(i);

10,QMap

基于红黑树算法的一套字典,它通过(Key, value)存储一对值,并通过Key可以查找与之关联的value的值,在QMap中,项总是按键排序。

插入:可以用运算符[ ]插入一对 (key,value) 到QMap对象中:
QMap<QString, int> map;
map["one"] = 1;
map["three"] = 3;
map["seven"] = 7;

使用函数insert()插入
QMap<QString, int> map;
map.insert("twelve", 12);


查询:获取值
int num1 = map["thirteen"];
int num2 = map.value("thirteen");
查看QMap对象中是否包含某一项:
int timeout;
if (map.contains("TIMEOUT"))
{
	timeout = map.value("TIMEOUT");
}


遍历:查看键值
QMap<QString, int> map;
map["one"] = 1;
map["three"] = 3;
QMapIterator<QString, int> i(map);
while (i.hasNext()) 
{
     i.next();
     cout << i.key() << ": " << i.value() << endl;
}

遍历:只查看值
QMap<QString, int> map;
 foreach (int value, map)
     cout << value << endl;

11,QHash

和QMap区别是,QHash中的键值对不会进行自动排序,而是根据Hash值存储。QHash中每个键只允许一个值,它提供比QMap更快的查找,但所需空间更大。在QHash中,键值是任意排序,QMap默认按照键值升序排序。

插入
	QHash<int,QString> qhash;
     //方式一
     qhash[1] = "1";
     qhash[2] = "2";
     qhash[3] = "3";
 
     //方式二
     qhash.insert(4, “4”);


获取值
    //方式一   
    QString str1=qhash.value(1);//str1="1";
 
    //方式二
    QString str2=qhash[2];//str1="2";


查找
     QString str;
    if(qhash.contains(1))
    {
        str=qhash.value(1);      
    }


遍历
    QHash<int,QString>::const_iterator it = qhash.constBegin();
    while (it != qhash.constEnd()) 
    {
        qDebug() << it.key() << ": " << it.value();
        ++i;
	    if(it.value() == "aaa")
	    {
	    	qhash.erase(it);//删除
	    }
    }


删除
    qhash.erase(it);//在迭代器中使用
    qhash.remove(key);

三,迭代器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/493329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(二)windows配置JDK环境

1、安装包下载地址,官网:Java Archive | Oracle 长期稳定支持版本8、11、17、21 选择一个需要下载的连接点进去: 在下载列表中根据操作系统选择不同的下载包: 注意:部分版本下载需要先登录后才可以下载。

Vit Transformer

一 VitTransformer 介绍 vit : An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 论文是基于Attention Is All You Need&#xff0c;由于图像数据和词数据数据格式不一样&#xff0c;经典的transformer不能处理图像数据&#xff0c;在视觉领域的应…

C++电子宠物商店

一、功能描述 店内有不同类型的电子宠物 1.每种电子宠物能通过显示出来的文本提出需要或表示情绪如&#xff1a;饿、渴、饱涨、困、不舒服、高兴、生气、伤心、绝望、无聊等。 2.店员用户通过键盘操作“饲养”电子宠物&#xff0c;给它实施喂饭、喂水、带它上厕所、陪它玩耍、…

3.27作业

1、完成下面类 #include <iostream> #include <cstring> using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10){str new char[size]; …

凯撒加密.

题目描述 给定一个单词&#xff0c;请使用凯撒密码将这个单词加密 凯撒密码是一种替换加密的技术&#xff0c;单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即a变为 d&#xff0c;变为e.&#xff0c;w 变为z&#xff0c;2 变为a&#xff0c;y变为 6&#xff0c;z变…

javaWeb项目-大学生体质测试管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JSP技术 JSP(Jav…

python笔记进阶--面向对象(2)

目录 1.类和对象&#xff08;实例&#xff09; 1.1对象&#xff08;实例&#xff09; 1.1.1使用对象组织数据 1.1.2类中增加属性 1.2成员方法&#xff08;类&#xff09; 1.2.1类的定义和使用语法 1.2.2成员方法的使用 1.2.3self关键字的作用 1.3类和对象 2&#xff…

Mysql各种日志管理

文章目录 事务日志事务日志的记录过程事务日志类型事务日志的相关变量 错误日志二进制日志功能作用文件的构成日志格式查看日志删除日志 通用日志慢查询日志 Mysql日志记录着数据库在运行过程中的各种操作&#xff0c;帮助管理员定位查找问题。 事务日志 事务日志(Transaction…

方案分享 | 嵌入式指纹方案

随着智能设备的持续发展&#xff0c;指纹识别技术成为了现在智能终端市场和移动支付市场中占有率最高的生物识别技术。凭借高识别率、短耗时等优势&#xff0c;被广泛地运用在智能门锁、智能手机、智能家居等设备上。 上海航芯在2015年进入指纹识别应用领域&#xff0c;自研高性…

MySQL的安装(Linux版)

1.所需要的文件 MySQL.zip 2. 卸载自带的Mysql-libs # 查看是否存在 rpm -qa | grep mariadb# 如果存在则执行命令进行卸载 rpm -e --nodeps mariadb-libs3.在/opt目录下创建MySQL目录并上传所需要的安装包 cd /optmkdir MySQL4.按照编号顺序安装&#xff08;压缩包在解压完…

vs2010打包QT程序

一、环境 win10 、 VS2010 、 qt5.7.1 将代码在release模式下运行 运行完后会在相应的文件夹下生成exe文件&#xff0c;也会将部分dll文件拷贝到release文件夹中 二、生成可执行文件 2.1 选择“文件”->“新建”->”项目“ 2.2 在打开的对框中选择”其他类型项目…

视频素材网有哪些?7个优质无水印素材库推荐

当今社会&#xff0c;视频内容已成为最吸引眼球的媒介之一&#xff0c;无论是社交媒体的短视频还是专业制作的影片&#xff0c;都离不开高质量的视频素材。为了帮助你在茫茫网海中找到宝藏&#xff0c;下面我精选了一系列视频素材网站&#xff0c;不仅提供丰富多样的视频资源&a…

(1) 易经与命运_学习笔记

个人笔记&#xff0c;斟酌阅读 占卦的原理 三个铜板&#xff0c;正面是3&#xff0c;反面2&#xff0c;三个一起转&#xff0c;得出6,7,8,9 数字象6老阴7少阳8少阴9老阳 生数和成数 生数和成数应该说出自《河图》。其中一二三四五为生数&#xff0c;六七八九十为成数。 生…

Typst入门简明教程

文章目录 写在前面对比阅读安装Typst的安装系统路径设置VSCode的设置 用Typst写作节指令图指令表指令公式指令参考文献指令引用指令节的标签图、表、公式的标签参考文献的标签 Typst编译 Typst的<label>写法建议写在最后&#xff1a;Typst、LaTex和Word的比较 写在前面 …

面试经典150题【111-120】

文章目录 面试经典150题【111-120】67.二进制求和190.颠倒二进制位191.位1的个数136.只出现一次的数字137.只出现一次的数字II201.数字范围按位与5.最长回文子串97.交错字符串72.编辑距离221.最大正方形 面试经典150题【111-120】 六道位运算&#xff0c;四道二维dp 67.二进制…

未能加载文件或程序集socutdata或它的某一个依赖项试图加载格式不正确的程序

未能加载文件或程序集socut data或它的某一个依赖项试图加载格式不正确的程序 Socut.Data.dll找不到类型或命名空间名称 把bin目录下面 的socut.data.dll删除就行了 C#报错未能加载文件或程序集socut data或它的某一个依赖项试图加载格式不正确的程序 "/"应用程序…

逐步学习Go-并发通道chan(channel)

概述 Go的Routines并发模型是基于CSP&#xff0c;如果你看过七周七并发&#xff0c;那么你应该了解。 什么是CSP&#xff1f; "Communicating Sequential Processes"&#xff08;CSP&#xff09;这个词组的含义来自其英文直译以及在计算机科学中的使用环境。 CSP…

Android Studio详细安装教程及入门测试

Android Studio 是 Android 开发人员必不可少的工具。 它可以帮助开发者快速、高效地开发高质量的 Android 应用。 这里写目录标题 一、Android Studio1.1 Android Studio主要功能1.2 Android应用 二、Android Studio下载三、Android Studio安装四、SDK工具包下载五、新建测试…

Live800:设计与管理客户忠诚度计划,提升客户满意度与忠诚度

在当今竞争激烈的商业环境中&#xff0c;吸引新客户的成本远高于保留现有客户。因此&#xff0c;设计并实施一套有效的客户忠诚度计划&#xff0c;以提升客户满意度和忠诚度&#xff0c;已经成为企业获得长期成功的关键。文章将探讨如何设计和实施客户忠诚度计划&#xff0c;以…

ehters.js:provider

ethers.jsV5.4文档 安装ethers npm install ethers5.4.0// 引入 import { ethers } from ethersProviders /** Provider类* Provider类是对以太坊网络连接的抽象&#xff0c;为标准以太坊节点功能提供简洁、一致的接口。 */ const provider new ethers.providers.Web3Provider…