33 template <
typename MapType>
34 std::vector<typename MapType::key_type>
getUniqueKeys(
const MapType& aMap)
36 std::vector<typename MapType::key_type> allKeys;
37 if (aMap.empty()) {
return allKeys; }
39 typedef typename MapType::const_iterator mapIter;
40 for (mapIter it = aMap.begin(); it != aMap.end(); ++it) { allKeys.push_back(it->first); }
41 std::sort(allKeys.begin(), allKeys.end());
42 auto newEnd = std::unique(allKeys.begin(), allKeys.end());
43 allKeys.resize(std::distance(allKeys.begin(), newEnd));
52 template <
typename MapType>
53 unsigned int getUniqueSize(
const MapType& aMap) {
return getUniqueKeys<MapType>(aMap).size(); }
59 template <
typename MapType>
60 std::vector<std::pair<typename MapType::key_type, unsigned int> >
getNValuesPerKey(
const MapType& aMap)
62 typedef typename MapType::key_type keyT;
63 typedef typename MapType::const_iterator mapIter;
65 std::vector<std::pair<keyT, unsigned int> > valuesPerKey;
66 if (aMap.empty())
return valuesPerKey;
68 std::vector<keyT> uniqueKeys = getUniqueKeys<MapType>(aMap);
70 for (keyT key : uniqueKeys) {
71 std::pair<mapIter, mapIter> keyRange = aMap.equal_range(key);
72 valuesPerKey.push_back(std::make_pair(key, std::distance(keyRange.first, keyRange.second)));
80 template <
typename MapType>
81 std::vector<typename MapType::mapped_type>
getValuesToKey(
const MapType& aMap,
typename MapType::key_type aKey)
83 typedef typename MapType::const_iterator mapIter;
85 std::vector<typename MapType::mapped_type> values;
86 if (aMap.empty())
return values;
88 std::pair<mapIter, mapIter> keyRange = aMap.equal_range(aKey);
89 for (mapIter it = keyRange.first; it != keyRange.second; ++it) { values.push_back(it->second); }
102 template <
typename MapType>
103 std::vector<std::tuple<typename MapType::key_type, typename MapType::mapped_type, unsigned int> >
106 typedef typename MapType::key_type keyT;
107 typedef typename MapType::mapped_type mapT;
109 std::vector<std::tuple<keyT, mapT, unsigned int> > keyValuePairs;
110 if (aMap.empty())
return keyValuePairs;
114 for (std::pair<keyT, unsigned int> keyValues : nValuesPerKey) {
115 std::vector<mapT> valuesToKey =
getValuesToKey(aMap, keyValues.first);
117 mapT valueSum = std::accumulate(valuesToKey.begin(), valuesToKey.end(), 0.0);
118 keyValuePairs.push_back(std::make_tuple(keyValues.first, valueSum, keyValues.second));
122 std::sort(keyValuePairs.begin(), keyValuePairs.end(),
123 [](
const std::tuple<keyT, mapT, unsigned int>& lTuple,
const std::tuple<keyT, mapT, unsigned int>& rTuple)
124 { return std::tie(std::get<2>(rTuple), std::get<1>(rTuple)) < std::tie(std::get<2>(lTuple), std::get<1>(lTuple)); }
127 return keyValuePairs;
134 template<
typename MapType>
135 std::vector<typename MapType::mapped_type>
getAllValues(
const MapType& aMap)
137 typedef typename MapType::key_type keyT;
140 typedef typename MapType::mapped_type valueT;
141 std::vector<valueT> allValues;
142 for (
const keyT& key : allKeys) {
144 for (
const valueT& value : keyValues) {
145 allValues.push_back(value);
155 template <
typename MapType>
156 std::string
printMap(
const MapType& aMap)
158 if (aMap.empty())
return std::string(
"passed map is empty!");
160 typedef typename MapType::key_type keyT;
161 typedef typename MapType::mapped_type mapT;
163 std::stringstream mapContent;
164 mapContent <<
"content of map:\n";
166 mapContent <<
"key: " << key <<
" -> value(s):";
167 for (mapT value :
getValuesToKey(aMap, key)) { mapContent <<
" " << value; }
171 return mapContent.str() +
"\n";