2017-05-04 51 views
-2

這聽起來很危險,但我試圖做這樣的事情:「安全」的方式將元素添加到超出其大小(一個std ::向量),但根據其能力()

std::vector<StructureSlowToBeCreated> vElems; 

StructureSlowToBeCreated s1, s2; 

vElems.reserve(many_slots_for_structs); 

vElems[x1] = s1; // I can ensure x1, x2 < many_slots_for_structs 
vElems[x2] = s2; 

基本上,這個想法是避免使用

vElems.resize(many_slots_for_structs); 

由於兩個S1S2是緩慢的創造,所以我不想做兩次。正如我所說的,我可以100%保證X1X2將是矢量內能力邊界,還多次肯定之外大小邊界(ERGO,使用「在()」最終會成爲例外)。

有沒有更乾淨的方法來做到這一點?或者我應該認爲這個清潔夠了(我感覺它不是)。

我真的需要把S1X1指數,否則,我需要存儲X1S1參數和存儲二次地圖的鏈接X1s1在向量中的位置(並且我會增加在每次訪問時查看地圖的成本s1s2,這是我不惜一切代價避免的)。

非常感謝您的幫助。

+1

我想有很多關於如何使用向量的例子和參考。是的,有一個更清潔的方式,因爲你的方式是一個錯誤。 – juanchopanza

+1

如何使用'reserve'和'push_back'或'emplace_back'? – Galik

+0

要麼使用'emplace_back',以避免無意義的構造,修復你的類,以免構造起來太慢,或者使用'std :: vector >'(或'boost :: optional')來延遲構建實際的元素。 – GManNickG

回答

2

您不能在其大小之上訪問std :: vector。它似乎工作,但it is UB,它會在最後產生問題。

執行此任務的正常方法是使用地圖,以便只創建所需的元素。但是,找到第n個元素是O(logn),而不是std :: vector的常量時間。

std::map<size_t, StructureSlowToBeCreated> myMap; 

如果你真的需要恆定的時間訪問,你必須調整矢量大小。我知道你不想默認構建所有的元素,因爲這是一個耗時的操作。然後,您可以創建存儲對象的其他元素的std :: vector。例如:

std::vector<std::optional<StrSlowToBeCreated>> myVec; // as suggested by GManNickG 
std::vector<std::unique_ptr<StructureSlowToBeCreated>> myVec; 

也許,您可以根據對象大小在可選項和unique_ptr之間進行選擇。

+0

謝謝,使用std :: optional的想法看起來優雅而整潔。 –

+0

是的。可選的問題是您需要C++ 17或boost。此外,可選的大小大於其包含的對象的大小。使用unique_ptr有點複雜,但你只需要C++ 11,而unique_ptr的大小隻是指針的大小。 –

相關問題