C++ Qt開發:使用關聯容器類

當我們談論編程中的數據結構時,順序容器是不可忽視的一個重要概念。順序容器是一種能夠按照元素添加的順序來存儲和檢索數據的數據結構。它們提供了簡單而直觀的方式來組織和管理數據,為程序員提供了靈活性和性能的平衡。

Qt 中提供了豐富的容器類,用于方便地管理和操作數據。這些容器類涵蓋了各種不同的用途,從簡單的動態數組到復雜的映射和集合。本章我們將主要學習關聯容器,主要包括 QMapQSetQHash,它們提供了鍵值對存儲和檢索的功能,允許通過鍵來快速查找值。

1.1 QMap

QMap 是 Qt 中的有序關聯容器,用于存儲鍵值對,并按鍵的升序進行排序。以下是關于 QMap 的概述:

1.1.1 特點和用途

  • 有序性: QMap 中的元素是有序的,按照鍵的升序進行排列。
  • 唯一鍵: 每個鍵在 QMap 中是唯一的,不允許重復鍵。
  • 鍵值對存儲: 存儲鍵值對,每個鍵關聯一個值。
  • 性能: 插入和查找操作的平均復雜度是 O(log n),適用于需要按鍵排序并進行頻繁查找的場景。

1.1.2 函數和功能

以下是關于 QMap 常用函數及其功能的總結:

函數功能
insert(const Key &key, const T &value)QMap 中插入鍵值對。
insertMulti(const Key &key, const T &value)QMap 中插入允許相同鍵的多個值。
remove(const Key &key)移除指定鍵的元素。
value(const Key &key) const返回指定鍵的值。
contains(const Key &key) const判斷是否包含指定鍵。
isEmpty() const判斷 QMap 是否為空。
size() const返回 QMap 中鍵值對的數量。
clear()清空 QMap 中的所有元素。
keys() const返回 QMap 中所有鍵的列表。
values() const返回 QMap 中所有值的列表。
begin()返回指向 QMap 開始位置的迭代器。
end()返回指向 QMap 結束位置的迭代器。
constBegin() const返回指向 QMap 開始位置的常量迭代器。
constEnd() const返回指向 QMap 結束位置的常量迭代器。
find(const Key &key) const返回指向 QMap 中指定鍵的迭代器。
lowerBound(const Key &key) const返回指向 QMap 中不小于指定鍵的第一個元素的迭代器。
upperBound(const Key &key) const返回指向 QMap 中大于指定鍵的第一個元素的迭代器。
count(const Key &key) const返回指定鍵的數量。
toStdMap() constQMap 轉換為 std::map

這些函數提供了對 QMap 中鍵值對的插入、刪除、查找和遍歷等操作。根據需求選擇適當的函數以滿足操作要求。

1.1.3 應用案例

正如如下代碼所示,我們提供了QMap<QString,QString>字典類型的關聯數組,該數組中一個鍵映射對應一個值,QMap容器是按照順序存儲的,如果項目中不在意順序可以使用QHash容器,使用QHash效率更高些。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QtGlobal>
#include <QMap>
#include <QMapIterator>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QMap<QString,QString> map;map["1001"] = "admin";map["1002"] = "guest";map.insert("1003","lyshark");map.insert("1004","lucy");// map.remove("1002");// 根據鍵值對查詢屬性std::cout << map["1002"].toStdString().data() << std::endl;std::cout << map.value("1003").toStdString().data() << std::endl;std::cout << map.key("admin").toStdString().data() << std::endl;// 使用STL語法迭代枚舉Map鍵值對QMap<QString,QString>::const_iterator x;for(x=map.constBegin();x != map.constEnd(); ++x){std::cout << x.key().toStdString().data() << " : ";std::cout << x.value().toStdString().data() << std::endl;}// 使用STL語法實現修改鍵值對QMap<QString,QString>::iterator write_x;write_x = map.find("1003");if(write_x !=map.end())write_x.value()= "you ary in";// 使用QTglobal中自帶的foreach遍歷鍵值對QString each;// --> 單循環遍歷foreach(const QString &each,map.keys()){std::cout << map.value(each).toStdString().data() << std::endl;}// --> 多循環遍歷foreach(const QString &each,map.uniqueKeys()){foreach(QString x,map.value(each)){std::cout << each.toStdString().data() << " : ";std::cout << x.toStdString().data() << std::endl;}}return a.exec();
}

上述代碼是如何使用QMap容器,其實還有一個QMultiMap容器,該容器其實是QMap的一個子集,用于處理多值映射的類,也就是說傳統QMap只能是一對一的關系,而QMultiMap則可以實現一個Key對應多個Value或者是反過來亦可,實現一對多的關系。

如果總結起來可以發現兩者的異同點;

QMap
  • 唯一鍵: QMap 中每個鍵都是唯一的,不允許重復鍵。
  • 鍵排序: QMap 中的元素是按鍵的升序排列的。
  • 使用場景: 適用于需要鍵值對有序且鍵唯一的場景。
QMultiMap
  • 允許重復鍵: QMultiMap 中可以包含重復的鍵,即多個鍵可以映射到相同的值。
  • 鍵排序: QMultiMap 中的元素是按鍵的升序排列的。
  • 使用場景: 適用于允許鍵重復,并且需要鍵值對有序的場景。
相同點
  1. 鍵值對: 都是用于存儲鍵值對的容器。
  2. 有序性: 元素在容器中是有序的,按鍵的升序排列。
不同點
  1. 鍵唯一性: QMap 中每個鍵都是唯一的,而 QMultiMap 允許重復的鍵。
  2. 使用場景: QMap 適用于需要鍵唯一的情況,而 QMultiMap 適用于允許鍵重復的情況。

如下所示,展示了如何使用QMultiMap實現一對多的映射關系;

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QList>
#include <QMultiMap>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QMultiMap<QString,QString> mapA,mapB,mapC,mapD;mapA.insert("lyshark","1000");mapA.insert("lyshark","2000");mapB.insert("admin","3000");mapB.insert("admin","4000");mapC.insert("admin","5000");// 獲取到里面的所有key=lyshark的值QList<QString> ref;ref = mapA.values("lyshark");for(int x=0;x<ref.size();++x){std::cout << ref.at(x).toStdString().data() << std::endl;}// 兩個key相同可相加后輸出mapD = mapB + mapC;ref = mapD.values("admin");for(int x=0;x<ref.size();x++){std::cout << ref.at(x).toStdString().data() << std::endl;}return a.exec();
}

1.2 QHash

QHash 是一個無序的關聯容器,它存儲鍵值對,但與 QMap 不同,QHash 不會對鍵進行排序。

1.2.1 特點和用途

  • 鍵值對存儲: QHash 中的元素以鍵值對的形式存儲,但與 QMap 不同,QHash 中的元素是無序的。

  • 無序性: QHash 中的元素是無序的,沒有特定的排列順序。

  • 唯一鍵: 每個鍵在 QHash 中是唯一的,不允許重復鍵。

  • 性能: 插入和查找操作的平均復雜度是 O(1),適用于需要快速插入和查找的場景。

1.2.2 函數和功能

以下是關于 QHash 常用函數及其功能的總結:

函數功能
insert(const Key &key, const T &value)QHash 中插入鍵值對。
insertMulti(const Key &key, const T &value)QHash 中插入允許相同鍵的多個值。
remove(const Key &key)移除指定鍵的元素。
value(const Key &key) const返回指定鍵的值。
contains(const Key &key) const判斷是否包含指定鍵。
isEmpty() const判斷 QHash 是否為空。
size() const返回 QHash 中鍵值對的數量。
clear()清空 QHash 中的所有元素。
keys() const返回 QHash 中所有鍵的列表。
values() const返回 QHash 中所有值的列表。
begin()返回指向 QHash 開始位置的迭代器。
end()返回指向 QHash 結束位置的迭代器。
constBegin() const返回指向 QHash 開始位置的常量迭代器。
constEnd() const返回指向 QHash 結束位置的常量迭代器。
find(const Key &key) const返回指向 QHash 中指定鍵的迭代器。
count(const Key &key) const返回指定鍵的數量。
unite(const QHash &other)合并兩個 QHash,將 other 中的元素合并到當前 QHash
intersect(const QHash &other)保留兩個 QHash 中共有的元素,刪除其他元素。
subtract(const QHash &other)從當前 QHash 中移除與 other 共有的元素。
toStdHash() constQHash 轉換為 std::unordered_map

這些函數提供了對 QHash 中鍵值對的插入、刪除、查找和遍歷等操作。根據需求選擇適當的函數以滿足操作要求。

1.2.3 應用案例

QHashQMap其實是一樣的,如果不需要對鍵值對進行排序那么使用QHash將會得到更高的效率,正是因為Hash的無序,才讓其具備了更加高效的處理能力。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QHash>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QHash<QString, QString> hash;hash["1001"] = "admin";hash["1002"] = "guest";hash.insert("1003", "lyshark");hash.insert("1004", "lucy");// hash.remove("1002");// 根據鍵值對查詢屬性std::cout << hash["1002"].toStdString().data() << std::endl;std::cout << hash.value("1003").toStdString().data() << std::endl;std::cout << hash.key("admin").toStdString().data() << std::endl;// 使用STL語法迭代枚舉Hash鍵值對QHash<QString, QString>::const_iterator x;for (x = hash.constBegin(); x != hash.constEnd(); ++x){std::cout << x.key().toStdString().data() << " : ";std::cout << x.value().toStdString().data() << std::endl;}// 使用STL語法實現修改鍵值對QHash<QString, QString>::iterator write_x;write_x = hash.find("1003");if (write_x != hash.end())write_x.value() = "you are in";// 使用Qt中自帶的foreach遍歷鍵值對QString each;// --> 單循環遍歷foreach (const QString &each, hash.keys()){std::cout << hash.value(each).toStdString().data() << std::endl;}// --> 多循環遍歷foreach (const QString &each, hash.uniqueKeys()){foreach (QString x, hash.values(each)){std::cout << each.toStdString().data() << " : ";std::cout << x.toStdString().data() << std::endl;}}return a.exec();
}

這里需要說明一點,與QMap一樣,QHash也能夠使用QMultiHash其操作上與QMultiMap保持一致,此處讀者可自行嘗試。

1.3 QSet

QSet 是 Qt 中的無序關聯容器,類似于 C++ 標準庫的 std::unordered_set。它主要用于存儲唯一值,而不關心元素的順序。以下是關于 QSet 的概述:

1.3.1 特點和用途

  • 無序性: QSet 中的元素是無序的,沒有特定的排列順序。
  • 唯一值: 每個值在 QSet 中是唯一的,不允許重復值。
  • 性能: 適用于需要快速查找和檢索唯一值的場景,性能比有序容器(如 QMap)更高。
  • 底層實現: 使用哈希表實現,因此插入和查找操作的平均復雜度是 O(1)。

1.3.2 函數和功能

以下是關于 QSet 常用函數及其功能的總結:

函數功能
insert(const T &value)QSet 中插入元素。
contains(const T &value) const判斷是否包含指定元素。
remove(const T &value)移除指定元素。
isEmpty() const判斷 QSet 是否為空。
size() const返回 QSet 中元素的數量。
clear()清空 QSet 中的所有元素。
unite(const QSet &other)合并兩個 QSet,將 other 中的元素合并到當前 QSet
intersect(const QSet &other)保留兩個 QSet 中共有的元素,刪除其他元素。
subtract(const QSet &other)從當前 QSet 中移除與 other 共有的元素。
begin()返回指向 QSet 開始位置的迭代器。
end()返回指向 QSet 結束位置的迭代器。
constBegin() const返回指向 QSet 開始位置的常量迭代器。
constEnd() const返回指向 QSet 結束位置的常量迭代器。

這些函數提供了對 QSet 中元素的插入、刪除、查找和遍歷等操作。QSet 是一個無序容器,用于存儲唯一的元素。根據需求選擇適當的函數以滿足操作要求。

1.3.3 應用案例

QSet 集合容器,是基于散列表(哈希表)的集合模板,存儲順序同樣不定,查找速度最快,其內部使用QHash實現。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QSet>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSet<QString> set;set << "dog" << "cat" << "tiger";// 測試某值是否包含于集合if(set.contains("cat")){std::cout << "include" << std::endl;}return a.exec();
}

1.4 嵌套案例總結

1.4.1 QList與QMap組合

代碼通過結合使用 QListQMap 實現了數據的嵌套存儲。具體而言,通過在 QMap 中存儲鍵值對,其中鍵是時間字符串,而值是包含浮點數數據的 QList。這種結構使得可以方便地按時間檢索相關聯的數據集。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QtGlobal>
#include <QList>
#include <QMap>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QMap<QString,QList<float>> map;QList<float> ptr;// 指定第一組數據ptr.append(10.1);ptr.append(12.5);ptr.append(22.3);map["10:10"] = ptr;// 指定第二組數據ptr.clear();ptr.append(102.2);ptr.append(203.2);ptr.append(102.1);map["11:20"] = ptr;// 輸出所有的數據QList<float> tmp;foreach(QString each,map.uniqueKeys()){tmp = map.value(each);std::cout << "Time: " << each.toStdString().data() << std::endl;for(qint32 x=0;x<tmp.count();x++){std::cout << tmp[x]<< std::endl;}}return a.exec();
}

在示例中,兩組數據分別對應不同的時間鍵,每組數據存儲在相應的 QList 中。最后,通過迭代輸出了所有數據,以時間為鍵檢索相應的數據集,并將每個數據集中的浮點數逐個輸出。整體而言,這種數據結構的嵌套使用有助于組織和檢索多維度的數據。

1.4.2 QList合并為QMap

通過使用 QList 存儲頭部信息(Header)和相應的數值信息(Values),然后通過循環迭代將兩個列表合并為一個 QMap。在這個 QMap 中,頭部信息作為鍵,而數值作為相應的值,形成了一個鍵值對應的字典結構。最后,通過 QMap 的鍵值對操作,輸出了特定字典中的數據。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QtGlobal>
#include <QList>
#include <QMap>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QList<QString> Header = {"MemTotal","MemFree","Cached","SwapTotal","SwapFree"};QList<float> Values = {12.5,46.8,68,100.3,55.9};QMap<QString,float> map;// 將列表合并為一個字典for(int x=0;x<Header.count();x++){QString head = Header[x].toStdString().data();float val = Values[x];map[head] = val;}// 輸出特定字典中的數據std::cout << map.key(100.3).toStdString().data() << std::endl;std::cout << map.value("SwapTotal") << std::endl;return a.exec();
}

整體而言,這樣的數據結構使得能夠更方便地按照特定的頭部信息檢索相應的數值。

1.4.3 QMap拆分為QList

這段代碼演示了如何使用 QMap 存儲鍵值對,并分別將鍵和值存儲到兩個 QList 中。首先,通過 Display 函數輸出了 QMap 中的鍵值對。

接著,通過 map.keys()map.values() 分別獲取 QMap 中的所有鍵和值,將它們存儲到兩個 QList 中,并使用循環分別輸出了這兩個列表的內容。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QtGlobal>
#include <QList>
#include <QMap>void Display(QMap<QString,float> map)
{foreach(const QString &each,map.uniqueKeys()){std::cout << each.toStdString().data() << std::endl;std::cout << map.value(each) << std::endl;}
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QMap<QString,float> map;map["MemTotal"] = 12.5;map["MemFree"] = 32.1;map["Cached"] = 19.2;Display(map);QList<QString> map_key;QList<float> map_value;// 分別存儲起來map_key = map.keys();map_value = map.values();// 輸出所有的key值for(int x=0;x<map_key.count();x++){std::cout << map_key[x].toStdString().data() << std::endl;}// 輸出所有的value值for(int x=0;x<map_value.count();x++){std::cout << map_value[x] << std::endl;}return a.exec();
}

1.4.4 QList結構體排序

實現對包含結構體 MyStructQList 進行排序,并輸出排序后的結果。首先,定義了一個包含整數的 QList,通過 std::sort 函數按從大到小的順序對該列表進行排序,并使用 Display 函數輸出排序后的結果。

其次,定義結構體 MyStruct,其中包含兩個成員變量 uuiduname。創建一個存儲該結構體的 QList,并添加了幾個結構體對象。通過 devListSort 函數,以結構體的 uuid 成員進行排序,并使用循環輸出排序后的結果。

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QtGlobal>
#include <QList>struct MyStruct
{int uuid;QString uname;
};void Display(QList<int> ptr)
{foreach(const int &each,ptr)std::cout << each << " ";std::cout << std::endl;
}// 由大到小排列
int compare(const int &infoA,const int &infoB)
{return infoA > infoB;
}// 針對結構體的排序方法
void devListSort(QList<MyStruct> *list)
{std::sort(list->begin(),list->end(),[](const MyStruct &infoA,const MyStruct &infoB){return infoA.uuid < infoB.uuid;});
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 定義并對單一數組排序QList<int> list = {56,88,34,61,79,82,34,67,88,1};std::sort(list.begin(),list.end(),compare);Display(list);// 定義并對結構體排序QList<MyStruct> list_struct;MyStruct ptr;ptr.uuid=1005;ptr.uname="admin";list_struct.append(ptr);ptr.uuid=1002;ptr.uname = "guest";list_struct.append(ptr);ptr.uuid = 1000;ptr.uname = "lyshark";list_struct.append(ptr);devListSort(&list_struct);for(int x=0;x< list_struct.count();x++){std::cout << list_struct[x].uuid << " ---> ";std::cout << list_struct[x].uname.toStdString().data() << std::endl;}return a.exec();
}

上述這段代碼演示了如何對一個包含整數的列表和一個包含結構體的列表進行排序,并輸出排序后的結果。在結構體排序的情況下,使用了自定義的排序方法 devListSort,該方法按照結構體的 uuid 成員進行升序排序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212527.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212527.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI:大模型技術

Prompt Prompt&#xff08;提示&#xff09;是一種在人工智能領域&#xff0c;特別是在自然語言處理和聊天機器人中常用的技術。它是一種輸入&#xff0c;用于激發人工智能模型生成相應的輸出。在聊天機器人中&#xff0c;用戶輸入的問題或請求就是提示&#xff0c;而聊天機器…

基于AidLux的工業視覺少樣本缺陷檢測實戰應用

1. 模型轉換 AIMO網站&#xff1a; http://aimo.aidlux.com/ 試用賬號和密碼&#xff1a; 賬號&#xff1a;AIMOTC001 &#xff0c;密碼&#xff1a;AIMOTC001 上傳模型選擇目標平臺參數設置選擇自動轉換轉換結果并下載 2. 基于AidLux的語義分割模型部署 dataset2aidlux文件…

期待一下elasticsearch還未發布的8.12版本,由lucene底層帶來的大幅度提升

現在是北京時間23年12月10日。當前es最新版本還是es8.11版本。我們可以期待一下不久的將來&#xff0c;es的8.12版本看到大幅度的檢索性能提升。受益于 Lucene 9.9版本&#xff0c;內核帶來的大幅提升&#xff01; 此次向量檢索利用底層指令fma會性能提升5%。并且還提供了向量點…

在Spring Cloud使用Hystrix核心組件,并注冊到Eureka注冊中心去

其實吧&#xff0c;寫Spring Cloud系列&#xff0c;我有時候覺得也挺難受的&#xff0c;因為Spring Cloud的微服務啟動都需要一個一個來&#xff0c;并且在IDea中也需要占用比較大的內存&#xff0c;并且我本來可以一篇寫完5大核心組件的&#xff0c;但是我卻分了三篇&#xff…

簡單的圖像分類任務全流程示例(內含代碼)

以下是一個簡單的示例&#xff0c;展示了如何使用 PyTorch 處理自定義圖像分類數據集&#xff1a; import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torch.utils.data import DataLoad…

erlang實現用ets做一級緩存

一、Erlang中的ETS表和DETS表 ETS表是Erlang中的一種數據結構&#xff0c;它允許我們在內存中存儲數據。ETS表有許多用途&#xff0c;其中包括作為緩存的一種實現方式。ETS表的特點是它們在內存中以表的形式存儲數據&#xff0c;這使得訪問和操作數據非常快。 DETS表是Erlang…

【求職】外企德科-網易游戲測試面試記錄

前面的話&#xff1a;本來沒想寫&#xff0c;但是竟然收到了一面通過的通知&#xff0c;那就來回顧一下一面&#xff0c;為終面做做準備。 這次面試基本沒有做什么準備&#xff0c;本來也就是抱著試一試的心態做的筆試&#xff0c;結果筆試通過了&#xff0c;由于筆試的內容很…

LINUX-ROS集成安裝MQTT庫步驟注意事項

環境信息 roottitan-ubuntu1:/home/mogo/data/jp/paho.mqtt.cpp# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic 步驟 安裝doxygen sudo apt install doxygen 構…

Fcopy: 基于Coke實現內網大文件分發

在工作中&#xff0c;我曾與小伙伴討論過這樣一個實際問題&#xff1a;數據制作流程產生了一份需要上線的文件&#xff0c;而線上有數十臺甚至上百臺機器&#xff0c;有什么樸素的辦法以盡可能快的速度將文件分發到指定的機器上嗎&#xff1f;根據作者已有的知識&#xff0c;分…

普冉(PUYA)單片機開發筆記(5): 配置定時器PWM輸出

概述 定時器的輸出通道作為 PWM 驅動是 MCU 的常用功能。 PY32F003 有一個高級定時器 TIM1 和一個通用定時器 TIM3&#xff0c;這兩個定時器都可以驅動4個輸出通道。現在我們就利用 TIM1 的某一個通道實現可控占空比的 PWM 輸出。 原理簡介 看數據手冊&#xff0c;簡單摘錄…

激活函數數學詳解以及應用場景解釋

文章目錄 激活函數1. Sigmoid 激活函數例子及推導過程代碼 2. ReLU 激活函數例子及推導過程 3. Tanh 激活函數例子及推導過程代碼 4. Softmax 激活函數例子及推導過程代碼 CNN 中的卷積層工作原理卷積計算過程卷積后的輸出及 ReLU 應用 激活函數 激活函數在神經網絡中扮演著至…

IPSec 協議

在 TCP/IP 協議中&#xff0c;對 IP 數據包沒有提供任何安全保護&#xff0c;攻擊者可以通過網絡嗅探、 IP 欺騙、連接截獲等方法來攻擊正常的 TCP/IP 通信。因此&#xff0c;通信過程中會存在以下危險&#xff1a;數據并非來自合法的發送者、數據在傳輸過程中被非法篡改、信息…

前端知識(十七)——入口函數和特定函數的區別

入口函數和特定函數是編程中常見的兩種函數類型&#xff0c;它們在功能和使用場景上有所不同。下面我將通過Python代碼示例來解釋它們的區別。 1.入口函數&#xff1a;入口函數通常是一個程序或模塊的起始點&#xff0c;它負責接收用戶輸入或外部數據&#xff0c;并啟動程序的…

DM8/達夢 數據庫管理員使用手冊詳解

1.1DM客戶端存放位置 Windows&#xff1a;DM數據庫安裝目錄中tool文件夾和bin文件夾中。 Linux&#xff1a;DM數據庫安裝目錄中tool目錄和bin目錄中。 1.2DM數據庫配置助手 1.2.1Windows創建數據庫 打開數據庫配置助手dbca 點擊創建數據庫實例 選擇一般用途 瀏覽選擇數據庫…

圖中的最長環

說在前面 &#x1f388;不知道大家對于算法的學習是一個怎樣的心態呢&#xff1f;為了面試還是因為興趣&#xff1f;不管是處于什么原因&#xff0c;算法學習需要持續保持&#xff0c;今天讓我們一起來看看這一道題目————圖中的最長環&#xff0c;圖論題目中比較常見的環路…

vite+TypeScript+vue3+router4+Pinia+ElmPlus+axios+mock項目基本配置

1.viteTSVue3 npm create vite Project name:... yourProjectName Select a framework:>>Vue Select a variant:>>Typescrit2. 修改vite基本配置 配置 Vite {#configuring-vite} | Vite中文網 (vitejs.cn) vite.config.ts import { defineConfig } from vite …

C語言筆試例題_指針專練30題(附答案解析)

C語言筆試例題_指針專練30題(附答案解析) 指針一直是C語言的靈魂所在&#xff0c;是掌握C語言的必經之路&#xff0c;收集30道C語言指針題目分享給大家&#xff0c;測試環境位64位ubuntu18.04環境&#xff0c;如有錯誤&#xff0c;懇請指出&#xff0c;文明討論&#xff01;&am…

基于SSM+JSP網上訂餐管理系統(Java畢業設計)

大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

Flask筆記三之連接使用數據庫

本文首發于公眾號&#xff1a;Hunter后端 原文鏈接&#xff1a;Flask筆記三之連接使用數據庫 這一節介紹 Flask 與數據庫的連接&#xff0c;以及接口里查詢數據的操作。 這里使用的是 SQLAlchemy pymysql 實現與數據庫的連接&#xff0c;SQLAlchemy 的詳細介紹見之前的筆記有…

藍橋杯2021年5月青少組Python程序設計國賽真題

30 個人在一條船上,超載&#xff0c;需要 15 人下船于是人們排成一隊&#xff0c;排隊的位置即為他們的編號。報數,從1開始,數到9的人下船。如此循環,直到船上僅剩15 人為止&#xff0c;問都有哪些編號的人下船了呢? 2】判斷101-200之間有多少個素數&#xff0c;并輸出所有素數…