2016-08-03 51 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以了解该索引是否曾用过。

相关问题