2012-05-27 3 views
0

У меня есть вектор, и он будет содержать максимум 10 объектов. Когда я создаю вектор, я считаю, что он создает 10 «пустых» объектов класса, которые он будет удерживать. Поэтому у меня проблема, потому что мой код полагается на проверку того, что векторный элемент равен null и, очевидно, он никогда не является нулевым.Проверка наличия элемента в векторе

Как я могу проверить, содержит ли векторный объект элемент, который я вставил, или один из конструкторов «пустой» по умолчанию при инициализации?

Есть ли техника вокруг этого?

(мне нужно проверить нуль, потому что я пишу рекурсивный алгоритм и оконечную точку, когда рекурсивная функция возвращает, когда объект в векторе равно нулю)

+0

Независимо от того, содержит ли он «пустые» объекты или нет (на самом деле это экземпляры, созданные по умолчанию), зависит от того, использовались ли вы «resize (10)» или «reserve (10)». –

ответ

1

Экземпляр класса не может быть пустым , Только указатель.

Вы, однако, имеете размер(), который вы можете использовать.

typedef stdd::vector<SomeClass> vec; 
//define some vec, v 
for (vec::size_type i = 0, s = vec.size(); i < s; ++i) { 
    //do something with v[i] 
} 

С помощью рекурсивной функции вы можете использовать эту идею, пройдя по максимальному индексу.

void recursiveFunc(vec& v, vec::size_type s); 

Затем при проверке вашего состояния на повторную проверку вам нужно будет проверить «я в конце вектора?»?

В качестве альтернативы, вместо того чтобы работать с индексами, вы можете использовать итераторы:

template <typename Iterator> 
void recursiveFunc(Iterator begin, const Iterator& end); 

Если все сделано правильно (и, если это возможно в вашей ситуации), это может разъединить ваши манипуляции с зная исходных данных, хранящихся в векторе.

Петли перейти вектор будет выглядеть:

while (begin != end) { 
    //do something with *begin 
    ++begin; 
} 
+0

Итак, если я создал вектор с начальным блоком размером 10, если бы я ничего не вставлял в вектор, размер был бы 0? (и я предполагаю, что емкость 10) – user997112

+0

@ user997112: Да. И это должно быть смежным. –

+0

@Corbin: Не так - 'vector' does * not * вставляет построенные по умолчанию элементы в неиспользуемое пространство, которое он выделил. Обычно он работает, выделяя необработанную память, а затем используя новое место размещения для создания элементов в этой памяти, когда это необходимо, но память, в которой вы ничего не вставили, - это просто необработанная память, а не объекты. –

0

Как уже упоминалось @Corbin, размер() возвращает количество элементов в векторе. Гарантируется отсутствие сквозных отверстий (смежных), поэтому вы гарантировали, что vector [vector.size()] пуст.

+0

Его не так много, я просто хочу сказать, весь ли вектор пуст и заполнен нереальными объектами – user997112

1

std::vector только вставляет "реальные" объекты. Он (по крайней мере, обычно) выделяет необработанную память и использует новое размещение для построения объектов в этой памяти по мере необходимости. Единственными объектами, которые он будет содержать, будут те, которые вы там разместите.

Конечно, если вы хотите, вы можете создать вектор, содержащий несколько копий объекта, который вы передаете конструктору. Аналогично, когда вы переносите вектор, вы передаете объект, который он скопирует в новые местоположения, если вы сделаете его более крупным.

Ни одна из них на самом деле не является нормой. В типичном случае вы просто создадите vector, который начнет содержать 0 объектов. Вы будете использовать push_back, чтобы добавить объекты в vector. Когда вы просматриваете vector, единственными объектами будут те, которые вы там ставите с push_back, и вам не нужно беспокоиться о возможности этого, содержащего любые другие объекты.

Если вы просто хотите проверить, является ли vector пуст, вы можете просто использовать:

if (your_vector.empty()) 

... который будет (достаточно очевидно) вернуть true если он пуст, и false, если он содержит, по крайней мере, один объект.

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