Сортировать массив / вектор строки - PullRequest
0 голосов
/ 11 апреля 2011

Как я могу отсортировать массив / вектор по повторению элементов? Например

Введите

Leo
Mike
Eric
Leo
Leo

Вывод _ _ _ Или

Leo       Leo
Leo       Eric
Leo       Mike
Eric
Mike

Ответы [ 3 ]

3 голосов
/ 11 апреля 2011

Я рекомендую обрабатывать ваши данные в 3 прохода:

  1. Используйте std :: sort, чтобы получить все повторяющиеся элементы рядом друг с другом.

  2. Выполните итерации по вашему отсортированному диапазону, записав длину и положение каждого равного_расса.

  3. Теперь вы можете прибегнуть к своей последовательности на основе данных, которые вы восстановили на шаге 2. Вы можете рассмотреть возможность использования stable_search на этом этапе, если вы хотите, чтобы дополнительный ключ поиска был алфавитным.

1 голос
/ 11 апреля 2011

Мне бы хотелось объяснить это словами и попросить вас написать код, но я обнаружил, что теперь я настолько знаком с C ++, что мне намного проще просто писать код.Небольшое изменение в том, что сказал Стив.Ваш оригинальный вектор строк v.

std::map<std::string, int> m;
for(auto i=v.begin(); i!=v.end(); ++i)
    m[*i]++;

typedef std::pair<std::string, int> P;
auto comp_by_second = [](const P & lhs, const P & rhs) { return lhs.second < rhs.second; };

for(auto i=v.begin(); !m.empty(); )
{
    auto j = std::max_element(m.begin(), m.end(), comp_by_second);
    while(j->second-- > 0)
        *i++ = j->first;
    m.erase(j);
}
0 голосов
/ 11 апреля 2011

Нет встроенного способа сделать это.Относительно простым способом является создание map<string, size_t>, содержащего счетчики каждого элемента (просто итерируйте по вашему входному вектору, увеличивая счетчик для каждой строки, которую вы видите).Затем запишите все ключи на карте в вектор и std::sort этот вектор с компаратором, который сравнивает число с карты.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...