Вопрос
Я хочу что-то вроде std:: карта, но я только хочу посмотреть, существует элемент или нет, на самом деле мне не нужны ключ И значение.Что я должен использовать?
Решение
Похоже, тебе нужен std:: установить.
Другие советы
Если вы хотите такого же поведения, как std::map
, тогда вы хотите std::set
.
Если вы смешиваете операции вставки / удаления и запроса, то std::set
вероятно, это лучший выбор.Однако, если вы можете сначала заполнить набор, а затем следовать за ним с помощью запросов, возможно, стоит рассмотреть возможность использования std::vector
, сортируя его, а затем используя двоичный поиск для проверки наличия в векторе.
Если вам действительно нужно только существование, и даже не порядок, вам нужен unordered_set
.Он доступен у вашего любимого поставщика C ++ 0x или boost.org.
Если ваши данные числовые, вы можете использовать std::vector, который оптимизирован для пространства:
D:\Temp>type vectorbool.cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<bool> vb(10);
vb[5] = true;
for (vector<bool>::const_iterator ci = vb.begin(); ci != vb.end(); ++ci) {
cout << *ci << endl;
}
}
D:\Temp>cl /nologo /W4 /EHsc vectorbool.cpp
vectorbool.cpp
D:\Temp>vectorbool.exe
0
0
0
0
0
1
0
0
0
0
Вероятно, вам следует взглянуть на stl::set
для того, что вам нужно.A stl::bitset
есть еще один вариант.
Это будет зависеть от того, как вам нужно использовать информацию, которая определит, какой из них лучше.A set
представляет собой отсортированную структуру данных, вставка, поиск и удаление которой занимают O (LOG N) времени.Но если вам нужно повторять по всем значениям, которые вы отметили для "существования", тогда set
это тот путь, по которому нужно идти.
Если вам нужно только отметить и выполнить поиск по факт если что-то является членом множества, то bitset
может быть, так будет лучше для тебя.Вставка, поиск и удаление занимают всего O (1), но вы можете собирать только int
ценности.Перебор всех отмеченных значений займет O (N), поскольку вам нужно просмотреть весь набор, чтобы найти элементы, для которых установлено значение true
.Вы можете использовать его совместно с stl::карта чтобы сопоставить имеющиеся у вас значения с числовыми значениями, bitset
потребности.
Посмотрите на операции, которые вам нужно выполнить со значениями в вашем наборе, и вы сможете выбрать соответствующую структуру данных
Вы можете продолжать использовать std::map для нужной цели.
Чтобы проверить, существует ли определенный элемент (типа ключа) на карте или нет, вы можете использовать следующий код:
if (mapObj.count(item) != 0)
{
// item exists
}
Как отвечалось ранее, std::set также выполнит эту работу.Интересно, что и set, и map внутренне представлены в виде Деревьев.
Если ключом ЯВЛЯЕТСЯ значение, то вы также можете рассмотреть "фильтр цветения", а не набор.