exercism-solutions/cpp/anagram/anagram.cpp

60 lines
1.1 KiB
C++

#include "anagram.h"
#include <algorithm>
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;
}
}