У меня есть вектор, который содержит месяц
Jan2013
Jan2013
Jan2013
Jan2014
Jan2014
Jan2014
Jan2014
Feb2014
Feb2014
По сути, я хочу выполнить поиск по вектору для каждой записи, сгруппировать их
вместе как
например
total count for Jan2013 = 3;
total count for Jan2014 = 4;
total count for Feb2014 = 2;
Конечно, как мы знаем, мы можем просто написать несколько, если решить это
if(monthyear = "Jan2013") {
//add count
}
if(monthyear = "Jan2014") {
//add count
}
if(monthyear = "Feb2014") {
//add count
}
но программист никак не собирается кодировать его таким образом.
Что делать, если до декабря 2014 года будет еще месяц, март2014, апрель2014, май2014
и январь-декабрь-2015 и так далее.
Я не думаю, что я должен принять такой метод жесткого кодирования в
в долгосрочной перспективе и ищет более динамичный подход.
Я не спрашиваю о кодах, а лишь о некоторых шагах и, возможно, даю мне подсказки о том, какие методы c ++ мне следует изучить
заранее спасибо
Ты можешь использовать std::map
, Например
std::map<std::string, size_t> m;
for ( const std::string &s : v ) ++m[s];
Я бы наверное сделал std::map<monthyear, int>
, Для каждого члена вашего вектора увеличьте этот элемент карты.
Просто для полноты: решение @VladfromMoscow оптимально для общего случая, когда у вас мало знаний о ваших входных данных. Это из O(N log N)
сложность для ввода длины N
,
Эквивалентно, вы можете сначала отсортировать ваш вклад в O(N log N)
и затем итерации в O(N)
над отсортированным вводом и сохранить счет в std::vector<std::pair<std::string, int>>
,
Тем не менее, если у вас есть априори информация о диапазоне вашего ввода (скажем, вы знать наверняка он работает с января 2013 года по январь 2014 года), вы также можете напрямую выполнить ввод и обновить предварительно выделенные std::vector<std::pair<std::string, int>>
в O(N)
сложность.