2016-12-02 4 views
1

"aabcdba"のような文字列があるので、別のキャラクタの位置を保存します。 vectorunordered_mapを使用して保存しようとしています。異なる文字の位置を格納する良いアプローチはありますか?ベクトルやマップを使って別のキャラクタのポジションを保存する方法

void topKFrequent(string s) { 
    vector<vector<int> >v(123); 
    //unordered_map<char, vector<int>>m; 
    for(int i=0;i<s.size();i++) { 
     v[s[i]].push_back(i); 
     // m[s[i]].push_back(i); 
    } 
    for(int i=0;i<123;i++) { 
     for(int j=0;j<v[i].size();j++) { 
       char ch=i; 
       cout<<ch<<"->"<<v[i][j]<<endl; 
     } 
    } 
} 

文字列=「aabcdba」は、私は以下の結果をしたい場合:

a->0,1,6; 
b->2,5; 
c->3; 
d->4; 
+3

なぜこれらのポジションを保存する必要がありますか?あなたは正確に何を解決しようとしていますか? – NathanOliver

+0

あなたが掲示したコードが、あなたのベクトルのベクトルを使って*未定義の動作*を呼び出すので、なぜこの背後にあるのかを少しでも考えてみてください。 – WhozCraig

+0

問題を解決しようとしていますが、問題は次のとおりです。「空でない文字列strと整数kを指定すると、同じ文字が少なくとも距離k離れているように文字列を並べ替えます。 – Atif

答えて

0

unordered_multimap使用している可能性位置を格納するための可能な実装:(キー文字は繰り返すことができます)。

void storePos(string s) { 
    unordered_multimap<char, int>m; 
    for(int i=0;i<s.size();i++) { 
     m.insert(make_pair(s[i],i)); 
    } 
} 

[EDITED] しかし、出力は、あなたがそれを使用するか、またはデータをプリントアウトする方法に依存してもよいです。例えば

、あなただけやるそれを埋めるために、std::multimap代わりにstd::unordered_mapの使用を考慮してください。

multimap<char, int>m; 

void storePos(string s) { 
    for(int i=0;i<s.size();i++) { 
     m.insert(make_pair(s[i],i)); 
    } 
} 

そして、あなたは以下のメソッドを持つことができ、データを印刷する:

void printPos() 
{ 
    std::multimap<char,int>::iterator it,itup; 

    for (it = m.begin(); it != m.end();) 
    { 
     cout << (*it).first << " -> "; 
     itup = m.upper_bound ((*it).first); 
     // print range [it,itup): 
     for (it; it!=itup; ++it) 
     { 
     cout << (*it).second << ", "; 
     } 
     cout << endl; 
    } 
} 

出力:

a -> 0, 1, 6, 
b -> 2, 5, 
c -> 3, 
d -> 4, 

Try this!

+0

string = "aabb"の場合、出力:a-> 0; a-> 1; b-> 2; b-> 3;が必要です:a-> 0,1; b-> 2,3 – Atif

+0

ポイント!私はあなたの要件を満たす答えを編集しました。 – Rama

2

map<char, vector<unsigned int> >を使用できます。

#include <iostream> 
#include <map> 
#include <string> 
#include <vector> 

using namespace std; 

map<char, vector<unsigned int> > storePos(string s) 
{ 
    map<char, vector<unsigned int> > charPos; 
    for(int i=0;i<s.size();i++) 
    { 
     auto itr = charPos.find(s[i]); 
     if(itr != charPos.end()) 
     { 
      itr->second.push_back(i); 
     } 
     else 
     { 
      charPos[s[i]] = vector<unsigned int>(1, i); 
     } 
    } 
    return charPos; 
} 

int main(void) 
{ 
    string example = "aabcdba"; 

    auto result = storePos(example); 

    for(auto itr1 = result.begin(); itr1 != result.end(); itr1 ++) 
    { 
     cout << "Letter: " << itr1->first << ", Locations: "; 
     for(auto itr2 = itr1->second.begin(); itr2 != itr1->second.end(); 
      itr2 ++) 
     { 
      cout << *itr2 << " "; 
     } 
     cout << endl; 
    } 
} 
1

あなたが本当に元の文字列の順序での順序位置を保存したい場合は、あなたがvectorcharの順序付けられていないか、注文したマップのいずれかで行うことができ、charが鍵であり、そしてvectorはポジションが含まれています。順序付けられていないマップを使用すると、は表示されません。は、探しているように見えるキーの辞書順を示しますが、正確な位置ベクトルを提供します。

#include <iostream> 
#include <string> 
#include <vector> 
#include <unordered_map> 

int main() 
{ 
    std::string s = "aabcdba"; 
    std::unordered_map<char, std::vector<unsigned int>> mymap; 

    for (unsigned i=0; i<s.size(); ++i) 
     mymap[s[i]].push_back(i); 

    for (auto const& pr : mymap) 
    { 
     std::cout << pr.first << "->"; 
     auto it = pr.second.cbegin(); 
     std::cout << *it; 
     while (++it != pr.second.cend()) 
      std::cout << ',' << *it; 
     std::cout << ";\n"; 
    } 
} 

出力

d->4; 
c->3; 
b->2,5; 
a->0,1,6; 

あなたは辞書式順序付けをしたい場合は、最も簡単な代替手段は、単に代わりに、定期的に注文したマップを使用してすることです。これに

std::unordered_map<char, std::vector<unsigned int>> mymap; 

:これだけを変更する

std::map<char, std::vector<unsigned int>> mymap; 

し、適切なヘッダを含む出力のための私達にこれを提供します。あなたが探しているように見える正確何に合う

a->0,1,6; 
b->2,5; 
c->3; 
d->4; 

ために。