Mit einem array als key in map C ++
Grundsätzlich, ich brauche, um zu finden, die alle übereinstimmenden Anagrammen zu Wort. Was ich Tat, war, mit einem array der Größe 26 für die Darstellung der Buchstaben in einem Wort.
Ex:
abcdefg={1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
aaaaaaa={7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
Dies ist, wie ich bin, erstellen Sie das array.
//stringtemp is a C++ string representing the word.
//letters is a size 26 int array representing all the letters in the string.
for(int i=0;i<stringtemp.length();i++)
{
letters[stringtemp[i]-65]+=1;
}
Und das ist, wie ich die Speicherung der array in der Karte.
dictionary[letters].push_back(stringtemp);
So, mache ich etwas falsch oder ist dies nicht möglich in C++. In allen anderen Antworten, die ich gefunden haben, Sie schlug vor, mit einem Vektor als Schlüssel, aber das funktioniert nicht in meinem Fall(denke ich.)
- Wie die Antworten unten zu reflektieren, eine C style array nicht kopieren, da man erwartet, dass es zu.
- Wie die Definitionen von
dictionary
undletters
helfen würde.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle
std::array<T, 26>
,std::string
undstd::vector<T>
sind perfekt gültigen key Typen für einestd::map
, da Sie alle definieren, die kleiner-als-Vergleich-Operatoren. Beachten Sie, dassstd::array<T, 26>
ist ähnlichstd::tuple<T, T, ..., T>
, und der Vergleich ist definiert lexikographisch, sehr ähnlich zu einem string-Vergleich.Mit ein bisschen mehr Arbeit, Sie können auch mit all diesen Arten von Schlüsseln für eine
std::unordered_map
, aber müssen Sie fügen Sie ein wenig boilerplate-code, die von Boost (mithash_combine
).std::string
ist nicht wirklich im Streit, ein key-Typ.std::array
. In GCC, fügen Sie-std=c++0x
zu Ihrem compiler-Befehl. Nutzen Sie alternativ<tr1/include>
undstd::tr1::array
.std::map Sie können einen Compare-operator im Konstruktor. Sie müssen möglicherweise einen solchen Komparator, um für zwei arrays {1,....} und {1,....} zu passen, da Sie möglicherweise unterschiedliche tatsächliche Objekte.
Den key-Typ in einer Karte muss eine
operator<
definiert. Sie definieren könnteoperator<
für Ihre array-Typ, aber es gibt einen viel einfacheren Ansatz: Sortieren Sie die Buchstaben in jedem Wort, in alphabetischer Reihenfolge, und verwenden, die sortiert string als Schlüssel.'a'
s wäre ziemlich ineffizient, dass die Art und Weise, obwohl.Ändern Sie Ihre int-array-Struktur mit
operator <
:Oder wenn Sie C++11-Unterstützung im compiler - verwenden Sie einfach
std::array<int,26>
.