Выполните итерации ключей в карте C++

если Вы не документируете перечисления в столбце описания схемы так, чтобы я мог выяснить то, что эти '5' находится в этом:

Select name from peeps where accountStatusId = 5

тогда делают это

Использование таблица для перечисления поля. например:

Select name 
from peeps p 
join accountStatus s 
on p.accountStatusID = s.asid 
where s.accountStatus = 'ActiveDude'
109
задан Bogdan Balan 18 September 2009 в 10:45
поделиться

6 ответов

Если вам действительно нужно скрыть значение, которое возвращает «настоящий» итератор (например, потому что вы хотите использовать свой итератор-ключ со стандартными алгоритмами, чтобы они работали с ключами, а не парами), а затем взгляните на transform_iterator .

[Совет: просматривая документацию по Boost для нового класса, сначала прочтите "примеры" в конце. Тогда у вас есть шанс выяснить, о чем, черт возьми, все остальное говорит: -)]

70
ответ дан 24 November 2019 в 03:17
поделиться

Я знаю, что это не ответ на ваш вопрос, но один из вариантов, который вы, возможно, захотите посмотреть, - это просто наличие двух векторов с одним и тем же индексом, являющихся «связанной» информацией.

..

std::vector<std::string> vName;

std::vector<int> vNameCount;

если вы хотите подсчитать имена по имени, вы просто быстро выполните цикл for по vName.size (), и когда вы найдете его, это индекс для vNameCount, который вы ищете.

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

Просто помните, что когда вы добавляете / удаляете из одного, вы должны делать это из другого, иначе все станет сумасшедшим, хех: P

1
ответ дан 24 November 2019 в 03:17
поделиться

Если вам нужен итератор, который просто возвращает ключи, вам нужно обернуть итератор карты в ваш собственный класс, который предоставляет желаемый интерфейс. Вы можете объявить новый класс итератора с нуля, например здесь , или использовать существующие вспомогательные конструкции. Этот ответ показывает, как использовать Boost transform_iterator , чтобы обернуть итератор в итератор, который возвращает только значения / ключи.

3
ответ дан 24 November 2019 в 03:17
поделиться

Вы хотите это сделать?

std::map<type,type>::iterator iter = myMap.begin();
std::map<type,type>::iterator iter = myMap.end();
for(; iter != endIter; ++iter)
{
   type key = iter->first;  
   .....
}
3
ответ дан 24 November 2019 в 03:17
поделиться

карта является ассоциативным контейнером. Следовательно, итератор - это пара ключей val. ЕСЛИ вам нужны только ключи, вы можете игнорировать часть значения из пары.

for(std::map<Key,Val>::iterator iter = myMap.begin(); iter != myMap.end(); ++iter)
{
Key k =  iter->first;
//ignore value
//Value v = iter->second;
}

EDIT: : Если вы хотите вывести наружу только ключи, вы можете преобразовать карту в вектор или ключи и выставить.

110
ответ дан 24 November 2019 в 03:17
поделиться

Вы можете

  • создать собственный класс итератора, объединяя std :: map :: iterator
  • use std :: transform из ваших map.begin () до map.end () с boost :: bind (& pair :: second, _1) функтором
  • просто игнорируйте член -> second при повторении с циклом for .
2
ответ дан 24 November 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: