2013-05-17 6 views
0

У меня есть два вектора a, b. Я хочу сравнить их размер. Я знаю, что могу использовать if (a.size()> b.size()). Но мой вопрос в том, что размер слишком велик из типа int для a или b и b. Например, a.size() - 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 и т. Д. Как я могу сравнить размеры a и b? Извините за мой английский.Как сравнить два больших размера вектора в C++

+0

Размер 'vector', в то время как технически неограниченный, практически ограничен количеством доступной ОЗУ. – Chad

+0

размер вектора не сохраняется в int, который хранится в size_t, который имеет специальный тип int. Вектор может хранить только максимальное значение элементов size_t, если вы достигнете этого максимума, у вас больше проблем, чем сравнение векторных размеров, скорее всего, это ограничено адресным пространством, а не ограничениями типа size_t, но я никогда не потрудился смотреть внутрь. – ChrisCM

+1

Значение, которое вы перечислите, составляет '10^134 - 1' (игнорируя« и т. Д. »). Учитывая, что в наблюдаемой вселенной есть оцененные «10^80» атомы, кажется маловероятным, что вы всегда найдете достаточно места для такого вектора. –

ответ

8

Невозможно, чтобы размер вектора (или любого объекта) мог быть больше, чем представляемый std::size_t. Этот тип может по определению хранить размер самого большого объекта, который может создать программа.

Как std::size_t является типом, возвращаемым функцией std::vector (или любой другой стандартной библиотечной библиотеки) size(), вы можете их сравнить.


Ответить на вопрос в комментариях:

std::size_t не является неограниченным (в конечном компьютере, нет ничего). Но он гарантированно будет достаточно большим, чтобы держать размер любого объекта возможным. Обратите внимание, что конкретный элемент, кроме массива, также является объектом. std::size_t также не ограничен оперативной памятью точно, больше на платформе, для которой вы строите. Примеры:

  • На обычной 32-битной системе (например, Win32), то адресное пространство 32-разрядное и самый большой объект может (в теории) занимают 2 байт, так std::size_t, по меньшей мере 32 бит.

  • На обычной 64-битной системе (например, Win64), адресное пространство 64-битные и самый большой объект (в теории) могут занимать 2 байт, поэтому std::size_t имеет длину по меньшей мере, 64 бита.

  • В реальном режиме x86 адресное пространство 20 бит, но ни один объект не может занимать более одного сегмента . В качестве сегментов 2 байтов, 16 бит достаточно для std::size_t, когда целевая платформа является реальным режимом x86.

+0

Вы имеете в виду, что size_t неограничен, только ОЗУ может ограничить размер вектора? – kaji331

+0

@ kaji331 Я добавил ответ на ответ. – Angew

+0

Спасибо. Вы имеете в виду, что объект и size_t ограничены платформой, поэтому я не могу создать неограниченный вектор, даже если у меня есть «неограниченная» ОЗУ, тогда size_t достаточно для сравнения? – kaji331