2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
std::list
是一個(gè)鏈接列表,與動(dòng)態(tài)數(shù)組的線性復(fù)雜性相比,它具有任意元素的恒定復(fù)雜性去除。對(duì)于少量元素,由于更好地使用緩存,vector 仍然可以更快,但漸近復(fù)雜性決定了大量元素的速度。std::vector
也就是說(shuō),為了從鏈表中選擇一個(gè)隨機(jī)元素進(jìn)行刪除,您需要使用輔助數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)低于線性的復(fù)雜性。
此外,python列表也具有刪除的線性復(fù)雜性,因此不清楚為什么您會(huì)認(rèn)為它更快。
隨機(jī)刪除可能更有效的可能是由不同大小的段組成的繩索數(shù)據(jù)結(jié)構(gòu)。但是標(biāo)準(zhǔn)庫(kù)中沒(méi)有使用此類數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的容器。
關(guān)于您的特定程序的更多信息,而不是隨機(jī)或任意刪除:似乎更好的算法可能是一種選擇:
使用矢量。將最后一個(gè)有效元素移到“已刪除”元素上,并擦除矢量末尾的已移動(dòng)對(duì)象。除非有效部分的順序很重要,否則可以使用此算法。

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊
嘗試創(chuàng)建一個(gè)專用類,該類不是在要?jiǎng)h除項(xiàng)目時(shí)實(shí)際刪除項(xiàng)目,而是將項(xiàng)目交換到垃圾部分的末尾。vectorvector
下面是可用于測(cè)試性能的代碼示例:
#include <vector>
#include <iostream>
using namespace std;
template <typename T>
struct FastDelVec {
vector<T> data;
int deleteIndex;
FastDelVec(int size) {
data.resize(size);
deleteIndex = size - 1;
}
void Delete(int index) {
swap(data[index], data[deleteIndex]);
--deleteIndex;
}
size_t size() {
return deleteIndex + 1;
}
};
int main() {
FastDelVec<int> v(100);
for (int i = 0; i < 100; ++i) {
v.data[i] = i;
}
v.Delete(30);
v.Delete(5);
v.Delete(21);
cout << v.size() << endl;
system("pause");
return 0;
}
您還可以嘗試其他幾種技巧。這會(huì)將刪除推遲到以后,因?yàn)椴粩噌尫哦褍?nèi)存并可能調(diào)整大小會(huì)降低性能vector
添加回答
舉報(bào)