#include "anagram.h" #include namespace anagram { using namespace std; namespace { struct Helper { Helper(const string &str, const locale &loc) { lowercase = str; transform(lowercase.begin(), lowercase.end(), lowercase.begin(), [=](char c){return tolower(c, loc);}); normalized = lowercase; sort(normalized.begin(), normalized.end()); } string lowercase; string normalized; }; } anagram::anagram(const string &_key) : key(_key) { } StringContainer anagram::matches(const StringContainer &input, const locale &loc) const { StringContainer result(input.size()); const Helper key_helper(key, loc); auto is_anagram = [=](const string &str) { Helper helper(str, loc); return helper.normalized == key_helper.normalized && helper.lowercase != key_helper.lowercase; }; auto iter = copy_if(input.cbegin(), input.cend(), result.begin(), is_anagram); result.resize(distance(result.begin(), iter)); return result; } }