2016-08-03 66 views
-1

如何檢查矢量中的索引是否已被使用?
我想是這樣的:如何檢查矢量中的索引是否已被使用

if(isUsed(vector,index)) 
    do something 
else 
    do something else 

例如:

std::vector<int> myVector; 
myVector[0] = 5; 
myVector[2] = 0; 
myVector[3] = 1; 

myVector.erase(3); 

isUsed(myVector,3) = false 
isUsed(myVector,1) = false 
isUsed(myVector,2) = true 
isUsed(myVector,5) = false 
isUsed(myVector,0) = true 

或:

std::map<int,std::string> myMap; 
myMap[1] = "x"; 

myMap.count(1) > 0 = true 
myMap.count(0) > 0 = false 

我想這個功能要快,因爲即時通訊有很多指標的工作。

+2

使用'的boost :: optional' –

+2

快得多你如何定義「拿來主義」?所有有效索引('0'到'size()-1')都有有效元素。 – juanchopanza

+2

如果你需要這樣做,你確定'vector'是正確的數據結構嗎? – Barmar

回答

1

,你可以嘗試一個std::unordered_map,它就像一張地圖,但對於大多數操作

std::unordered_map<int,std::string> myMap; 
myMap[1] = "w"; 

myMap.count(1) > 0 == true 
myMap.count(0) > 0 == false 
0

雖然使用boost ::選購正確的,它聽起來就像你可能會問這樣的事情std::map<int, Object>

0

使用關聯數組又名std::map

std::map<size_t,int> myVector; 
myVector[0] = 5; 
myVector[2] = 0; 
myVector[3] = 1; 

myVector.erase(3); 

和你isUsed()將等於:

myVector.count(3) 

如果需要,您可以將其包裹到功能中:

bool isUsed(const std::map<size_t,int> &m, size_t idx) 
{ 
    return m.count(idx); 
} 

如果你不關心你迭代你的容器的順序,你可以使用std::unordered_map來代替,這會更快,但迭代中元素的順序幾乎是隨機的。

0

當你在你的問題中解釋你的問題時,你可以使用完全相同的邏輯。這是創建一個具有您的矢量的確切大小的bool矢量,然後用false s對其進行初始化。

現在,每次使用索引時,只需轉至bool向量並將該索引更改爲true即表示之前已使用該索引。您可以檢查每個索引的值true || false以瞭解該索引是否曾用過。

相關問題