如何检查向量中的索引是否已被使用

时间:2016-08-03 21:54:13

标签: c++ vector

如何检查向量中的索引是否已被使用?
我想要这样的东西:

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

我希望这个功能很快,因为我正在使用很多索引。

4 个答案:

答案 0 :(得分:1)

你可以试试std::unordered_map,它就像一张地图,但对于大多数操作来说要快得多

add_filter( 'woocommerce_default_address_fields' , 'override_default_address_fields' );
function override_default_address_fields( $address_fields ) {

    // @ for city
    $address_fields['city']['class'] = array('form-row-first');
    $address_fields['city']['label'] = __('Province', 'woocommerce');

    // @ for postcode
    $address_fields['postcode']['label'] = __('Zipcode', 'woocommerce');

    return $address_fields;
}

答案 1 :(得分:0)

虽然使用boost :: optional更正,但听起来你可能会要求像std::map<int, Object>

这样的东西

答案 2 :(得分:0)

使用关联数组aka 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代替,这将更快,但迭代中元素的顺序将非常随机。

答案 3 :(得分:0)

您可以使用与您在问题中解释问题时使用的完全相同的逻辑。这是创建一个具有矢量大小的bool向量,然后使用false s初始化它。

现在每次使用索引时,只需转到bool向量并将该索引更改为true,表示之前已使用过。您可以检查每个索引的值true || false,以了解该索引是否在之前使用过。