C++ 如何存储不同的字符';使用矢量或地图定位

C++ 如何存储不同的字符';使用矢量或地图定位,c++,C++,我有一个类似“aabcdba”的字符串,现在我想存储不同字符位置的位置。我正在尝试使用向量和无序映射进行存储。有没有好的方法来存储不同字符的位置 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

我有一个类似“aabcdba”的字符串,现在我想存储不同字符位置的位置。我正在尝试使用
向量
无序映射
进行存储。有没有好的方法来存储不同字符的位置

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;
        }
    }
}

存储位置的一个可能实现是使用无序的_multimap:(其中关键字符可以重复)

要打印数据,可以使用以下方法:

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

#包括
#包括
#包括
#包括
使用名称空间std;
map storePos(字符串s)
{
查波斯地图;
for(int i=0;等秒推回(i);
}
其他的
{
charPos[s[i]]=向量(1,i);
}
}
返回charPos;
}
内部主(空)
{
字符串示例=“aabcdba”;
自动结果=storePos(示例);
对于(自动itr1=result.begin();itr1!=result.end();itr1++)
{
cout second.end();
itr2++)
{

cout如果您确实想在原始字符串序列中存储有序位置,可以使用
char
vector
的无序或有序映射来实现,其中
char
是键,
vector
包含这些位置。使用无序映射不会给出ke的字典顺序您似乎在寻找Y,但仍将为您提供准确的位置向量

#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";
    }
}
如果您想要按字典顺序排列,最简单的替代方法是简单地使用常规的有序映射。仅更改以下内容:

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

这正好符合你想要的。

为什么你需要存储这些位置?你到底想解决什么问题?请稍等片刻,了解一下原因背后的原因,因为你发布的代码使用向量向量方法调用了未定义的行为,我同意不这样做。我正在尝试解决一个问题问题是:“给定一个非空字符串str和一个整数k,重新排列字符串,使相同的字符之间至少有k个距离。”是@WhozCraig代码没有运行,我想知道正确的实现方式,以及是否有其他存储方式,因为如果我使用2d vector,那么我必须将1索引到123,但我只想将char映射到它的位置。现在上面的代码运行良好,但我无法使用无序的映射实现。@WhozCraigif string=“aabb”,您的输出:a->0;a->1;b->2;b->3;但我需要:a->0,1;b->2,3
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, 
#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;
    }
}
#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;