Ответ 1
Я пробовал это, и он работал
for( multimap<char,int>::iterator it = mymm.begin(), end = mymm.end(); it != end; it = mymm.upper_bound(it->first))
{
cout << it->first << ' ' << it->second << endl;
}
У меня есть multimap, и я хочу, чтобы все уникальные ключи в нем сохранялись в векторе.
multimap<char,int> mymm;
multimap<char,int>::iterator it;
char c;
mymm.insert(pair<char,int>('x',50));
mymm.insert(pair<char,int>('y',100));
mymm.insert(pair<char,int>('y',150));
mymm.insert(pair<char,int>('y',200));
mymm.insert(pair<char,int>('z',250));
mymm.insert(pair<char,int>('z',300));
Как я могу это сделать? существует способ подсчета количества элементов с ключом, но ни один не подсчитывает количество уникальных ключей в мультимаре.
Добавлено: По уникальному я имею в виду все ключи в мультимажете один раз - их можно повторить или встретить один раз в мультимажете.
Таким образом, уникальные ключи - x, y и z
Я пробовал это, и он работал
for( multimap<char,int>::iterator it = mymm.begin(), end = mymm.end(); it != end; it = mymm.upper_bound(it->first))
{
cout << it->first << ' ' << it->second << endl;
}
Поскольку записи a std::multimap<>
неявно отсортированы и выходят в отсортированном порядке при повторении через них, вы можете использовать алгоритм std::unique_copy
для этого:
#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
/* ...Your existing code... */
/* Create vector of deduplicated entries: */
vector<pair<char,int>> keys_dedup;
unique_copy(begin(mymm),
end(mymm),
back_inserter(keys_dedup),
[](const pair<char,int> &entry1,
const pair<char,int> &entry2) {
return (entry1.first == entry2.first);
}
);
/* Print unique keys, just to confirm. */
for (const auto &entry : keys_dedup)
cout << entry.first << '\n';
cout.flush();
return 0;
}
Дополнительная работа, добавленная этим, является линейной по количеству записей мультимапа, тогда как с использованием подхода std::set
или Jeeva для дедупликации добавляются вычислительные шаги O (n log n).
Примечание. Я использую выражение lambda, использующее С++ 11. Это можно переписать для С++ 03.
Итерации через все элементы mymm
и сохраните it->first
в set<char>
.
Я думаю, что вы можете сделать что-то подобное в случае, если unique
означает ключ, который содержится в multimap
только один раз:
1) постройте отсортированный list
всех ключей на карте
2) перебирать список и находить уникальные ключи. Это просто, поскольку все дубликаты будут рядом друг с другом в сортированном контейнере
Если вы хотите только все клавиши - используйте std::set
, как предположил Донотало
Проще всего было бы поместить ключи мультимашины в unordered_set
unordered_multimap<string, string> m;
//insert data in multimap
unordered_set<string> s; //set to store the unique keys
for(auto it = m.begin(); it != m.end(); it++){
if(s.find(it->first) == s.end()){
s.insert(it->first);
auto its = m.equal_range(it->first);
for(auto itr=its.first;itr!=its.second;itr++){
cout<<itr->second<<" ";
}
}
}