如何使用矢量或地图存储不同角色的位置

时间:2016-12-02 19:57:27

标签: c++

我有一个像#34; 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;
        }
    }
}

如果string =&#34; aabcdba&#34;,我想要以下结果:

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

2 个答案:

答案 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)

如果您确实希望在原始字符串序列中存储序号位置,则可以使用charvector的无序或有序地图,其中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;

完全符合 您正在寻找的内容。