2016-08-03 2 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

Использование 'подталкивание :: 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

Хотя использование наддува :: опциональный правильно это звучит, как вы могли бы просить что-то вроде 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); 
} 

Если вы не заботитесь о том, чтобы вы перебирали контейнер, ytou может использовать вместо этого std::unordered_map, который будет быстрее, но порядок элементов на итерации будет в значительной степени случайным.

0

Вы можете использовать ту же логику, что и вы, когда вы объясняли свою проблему в своем вопросе. Который должен создать вектор bool с точным размером вашего вектора, а затем инициализировать его с помощью false.

Теперь каждый раз, когда вы используете индекс, вы просто переходите к вашему вектору bool и меняете этот индекс на true, значит он использовался раньше. Вы можете проверить значение каждого индекса true || false, чтобы узнать, использовался ли этот индекс до или нет.

Смежные вопросы