2014-01-08 2 views
3

Ihave вектор, который содержит monthyearC++ найти ту же запись в векторе

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 
     } 

, но никоим образом не программист будет код его таким образом. Что делать, если есть дополнительные месячные march2014, апрель2014, май2014 полностью до dec2014 и jan2015-dec2015 и так далее.

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

Я не прошу кодов, а всего лишь несколько шагов и, возможно, даю мне несколько советов о том, какие методы C++ следует изучать.

Заранее спасибо

+4

Обязательно используйте 'monthyear ==" ... 2014 "' в ваших операторах if. – lcs

ответ

10

Вы можете использовать std::map. Например

std::map<std::string, size_t> m; 

for (const std::string &s : v) ++m[s]; 
+0

спасибо я буду смотреть на станд :: Карта – user2947249

+1

Вот пример #include #include #include #include INT основной() { \t станд :: вектор v = \t { \t \t "Jan2013", "Jan2013", "Jan2013", \t \t "Jan2014", "Jan2014", "Jan2014", "Jan2014", \t \t "Feb2014", "Feb2014" \t}; \t \t std :: map m; \t \t для (const std :: string & s: v) ++ m [s]; \t \t для (авто p: m) std :: cout << p.first << '\ t' << p.second << std :: endl; \t \t возвращение 0; } –

+0

еще раз спасибо – user2947249

5

Я бы, вероятно, сделал std::map<monthyear, int>. Для каждого члена вашего вектора добавьте этот член карты.

+0

спасибо, я посмотрю на std :: map – user2947249

+0

@ user2947249: Влад из Москвы дал вам отличный пример. –

1

Только для полноты: решение от @ 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) сложность.

+0

благодарю вас за информацию – user2947249

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