第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

C++ 從矢量效率問(wèn)題中刪除

C++ 從矢量效率問(wèn)題中刪除

開(kāi)滿天機(jī) 2022-08-25 13:48:52
我有2個(gè)完全相同的程序版本,迷宮生成器,用Python編寫,C++。在Python中優(yōu)化它后,我的想法是,如果我用C++重寫它,它將更快,更有效率。然而,我發(fā)現(xiàn)了一件令人驚訝的事情(當(dāng)你想到它時(shí),這并不奇怪)。對(duì)于Python:我的算法從列表中選擇一個(gè)隨機(jī)項(xiàng)目,處理它,然后從那里刪除它。對(duì)于C++:都是一樣的,但不是列表,而是使用向量。從C++中的向量中刪除元素比在Python中對(duì)列表執(zhí)行相同的操作要慢得多,因?yàn)楫?dāng)您刪除它們時(shí),向量的元素會(huì)發(fā)生變化。我的問(wèn)題是:C++中可以編制索引并比vector更快地執(zhí)行其項(xiàng)目刪除的最佳數(shù)據(jù)結(jié)構(gòu)是什么?現(xiàn)在C++的刪除時(shí)間是Python平均時(shí)間的5-6倍。
查看完整描述

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ì)象。除非有效部分的順序很重要,否則可以使用此算法。


查看完整回答
反對(duì) 回復(fù) 2022-08-25
?
翻閱古今

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


查看完整回答
反對(duì) 回復(fù) 2022-08-25
  • 2 回答
  • 0 關(guān)注
  • 74 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)