A tak naprawdę to jest powód dlaczego ,,kopiesz się z koniem" aby implementować to na piechotę? W projekcie nie możesz użyć biblioteki standardowej?
Napisanie ,,szkolnie" tak aby zrozumieć...
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <string>
using namespace std;
static string wordTable[] = { "Anna", "Anna", "Maria", "Maria", "Maria", "Anna", "Anna" };
static unordered_map<string, int> wordMap;
using wordMap_t = decltype(wordMap)::value_type;
struct DuplicateCounter {
static int sum;
void operator()(const wordMap_t& pr) {
sum += pr.second > 1 ? pr.second : 0;
}
} duplicateCounter;
int DuplicateCounter::sum = 0;
int main(void) {
for(const auto & word : wordTable) {
wordMap[word] += 1;
}
for_each(wordMap.begin(), wordMap.end(), duplicateCounter);
cout << "Duplicates = " << duplicateCounter.sum << endl;
}
Albo jeszcze szybciej lambdą:
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <string>
using namespace std;
static string wordTable[] = { "Anna", "Anna", "Maria", "Maria", "Maria", "Anna", "Anna" };
static unordered_map<string, int> wordMap;
using wordMap_t = decltype(wordMap)::value_type;
int main(void) {
int duplicates = 0;
for(const auto & word : wordTable) {
wordMap[word] += 1;
}
auto duplicateCounter = [&](const wordMap_t& pr) {
duplicates += pr.second > 1 ? pr.second : 0;
};
for_each(wordMap.begin(), wordMap.end(), duplicateCounter);
cout << "Duplicates = " << duplicates << endl;
}
: DDDDD
Przede wszystkim ten kod nie robi tego co miał robić - nie liczy liczby duplikatów, tylko liczy... liczbę elementów w tablicy. No muszę przyznać, że to chyba najbardziej zawiłe zliczanie elementów kolekcji jakie w życiu widziałem. No nieźle, nieźle ; ]
Błąd masz w tym miejscu:
auto duplicateCounter = [&](const wordMap_t& pr) {
duplicates += pr.second > 1 ? pr.second : 0;
};
Jeśli już to powinno być tak:
auto duplicateCounter = [&](const wordMap_t& pr) {
duplicates += pr.second > 1 ? pr.second - 1 : 0;
};
Ad vocem tematu, można jeszcze tak ; >
std::string vec[] = { "Anna", "Anna", "Maria", "Maria", "Maria", "Anna", "Anna" };
std::cout << boost::size(vec) - boost::size(boost::unique(boost::sort(vec)));
Btw, chciałem to napisać w range-v3 (czyli range dla c++17) ale z tego co widzę Eric Niebler nie zaimplementował size
: < (jest size ; p) (będzie za to syntax bind z Haskella : D ).