簡體   English   中英

QMap插入QVector <QString> 通過指針還是值?

[英]QMap insert QVector<QString> by pointer or value?

我想建立一個設備地圖,以便該地圖包含:

QString'DeviceID'和QVector'Command List'

目前,我的QMap如下:

QMap<QString, QVector<QString> *> devices;

QVector<QString> *pCommands= new QVector<QString>;
//       :
// Fill pCommands with lots of data here
//       :
devices.insert(RadioID, pCommands);

但是我想知道這是否真的更好:

QMap<QString, QVector<QString>> devices;

QVector<QString> commands;
//       :
// Fill commands with lots of data here
//       :
devices.insert(RadioID, commands);

我確信我在某處讀到Qt在復制數據時會做一些相當有效的事情。 我沒有看到很多人將指針與Qt一起使用,並且我不得不經過QMap刪除最后所有的QVector似乎很混亂...

我正在使用c ++ 11,所以也許某種移動語義可能在這里起作用?

編輯我修改了代碼中的注釋,以顯示矢量不為空。 我還要指出,一旦存儲數據,就不需要更改數據。

沒有理由考慮手動分配向量更好。

當然,您只需要復制一個指針,而不是一個向量,但是復制一個空向量仍然非常快。 存儲對象而不是指針的最大好處是您不需要手動進行內存管理。

我正在使用c ++ 11,所以也許某種移動語義可能在這里起作用?

如果QMap::insert支持移動語義,並且如果QVector像標准庫中的標准庫一樣是可移動構造的,那么您確實可以將向量移動到地圖中。 但是移動空向量與復制一樣快。

如果QMap具有類似函數std::mapemplace ,那么您甚至都可以移動就地構建矢量。

我對Qt並不熟悉,因此您需要從文檔中驗證這些詳細信息。 Qt是否支持移動語義並不能改變手動內存管理是一個痛苦的事實。


編輯:根據文檔, QVector似乎是可移動的,但QMap不支持移動語義。 但是,正如Arpegius和文檔所指出的那樣, QVector會進行寫時復制優化,因此只要不修改復制的向量,就不會復制數據。 復制空向量時,這實際上並不重要。


重新編輯

如果添加的向量中充滿了數據,則復制確實非常昂貴,除非它保持不變。 搬家可以彌補這一點,但是QMap似乎不支持這一點。 但是,還有另一個技巧:插入一個空向量,然后將整個向量與圖中的空向量swap

最簡單且幾乎是慣用的方式是:

QMap<QString, QVector<QString>> devices;

// Get the vector constructed in the map itself.
auto & commands = devices[RadioID];
// Fill commands with lots of data here - a bit faster
commands.resize(2);
commands[0] = "Foo";
commands[1] = "Bar";
// Fill commands with lots of data here - a bit slower
commands.append("Baz");
commands.append("Fan");

您會在Qt和其他代碼中經常看到這種模式,這是在C ++ 98和C ++ 11上同樣有效的最簡單方法:)

這樣,您就可以處理地圖中已經存在的向量。 向量本身永遠不會被復制。 向量的成員被復制,但是它們是隱式共享的,因此復制實際上是指針復制和原子引用計數增量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM