我有一个像#34; aabcdba"现在我想存储不同角色位置的位置。我正在尝试使用vector
和unordered_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;
}
}
}
如果string =&#34; aabcdba&#34;,我想要以下结果:
a->0,1,6;
b->2,5;
c->3;
d->4;
答案 0 :(得分: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 :(得分:1)
如果您确实希望在原始字符串序列中存储序号位置,则可以使用char
到vector
的无序或有序地图,其中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;
完全符合 您正在寻找的内容。