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

How to store different character's positon using vector or map

本文关键字:角色 位置 存储 地图 何使用      更新时间:2023-10-16

我有一个像" 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;

您可以使用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;
    }
}

如果您真的想在原始字符串序列中存储顺序位置,则可以使用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;

适合恰好您似乎正在寻找的东西。

存储位置的可能实现可以使用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));
    }
}

[编辑]但是输出可能取决于您的使用方式或打印数据。

例如,考虑使用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, 

尝试这个!