C++ 转移图<;字符串,成对>;传播

C++ 转移图<;字符串,成对>;传播,c++,dictionary,vector,C++,Dictionary,Vector,我有这张地图 typedef pair<int,int>p; map<string, p> m; 无济于事 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 好的,我把单词表改成了向量 我的副本现在可以用了。谢谢大家简单的方法是创建一个包含所有三个字段的结构: struct Record { std::string word; int count; std::streampos file

我有这张地图

typedef pair<int,int>p;
map<string, p> m;
无济于事

++++++++++++++++++++++++++++++++++++++++++++++++++++

好的,我把单词表改成了向量
我的副本现在可以用了。谢谢大家

简单的方法是创建一个包含所有三个字段的结构:

struct Record
{
  std::string word;
  int         count;
  std::streampos file_position;
};
下一步是遍历映射,创建上述结构的实例,填充它们并附加到向量:

std::vector<Record> database;
for (map<string,p>::const_iterator iter = m.begin();
     iter != m.end();
     ++iter)
{
  Record r;
  r.word = iter->first;
  r.count = iter->second.first;
  r.file_position = iter->second.second;
  database.push_back(r);
}
std::向量数据库;
对于(map::const_迭代器iter=m.begin();
iter!=m.end();
++国际热核聚变实验堆(iter)
{
记录r;
r、 word=iter->first;
r、 计数=iter->秒。第一;
r、 文件位置=iter->second.second;
数据库。推回(r);
}

向量现在已按顺序填充。可以使用
std::sort()
和自定义比较函数更改顺序

简单的方法是创建一个包含所有三个字段的结构:

struct Record
{
  std::string word;
  int         count;
  std::streampos file_position;
};
下一步是遍历映射,创建上述结构的实例,填充它们并附加到向量:

std::vector<Record> database;
for (map<string,p>::const_iterator iter = m.begin();
     iter != m.end();
     ++iter)
{
  Record r;
  r.word = iter->first;
  r.count = iter->second.first;
  r.file_position = iter->second.second;
  database.push_back(r);
}
std::向量数据库;
对于(map::const_迭代器iter=m.begin();
iter!=m.end();
++国际热核聚变实验堆(iter)
{
记录r;
r、 word=iter->first;
r、 计数=iter->秒。第一;
r、 文件位置=iter->second.second;
数据库。推回(r);
}

向量现在已按顺序填充。可以使用
std::sort()
和自定义比较函数更改顺序

这里有一个比较昂贵的解决方案,它通过引用映射对字符串列表进行排序:

// Make word list
std::vector<std::string> words;
words.reserve(m.size());
for (const auto & p : m) words.push_back(p.first);

// Sort
std::sort(
    words.begin(), words.end(),
    [&m](const std::string & lhs, const std::string & rhs)
    { return m.find(lhs)->second < m.find(rhs)->second; });
//制作单词列表
向量词;
字.保留(m.size());
对于(const auto&p:m)单词。向后推(p.first);
//分类
排序(
words.begin(),words.end(),
[&m](常量标准::字符串和左侧,常量标准::字符串和右侧)
{返回m.find(lhs)->secondsecond;};

这里有一个比较昂贵的解决方案,它通过引用映射对字符串列表进行排序:

// Make word list
std::vector<std::string> words;
words.reserve(m.size());
for (const auto & p : m) words.push_back(p.first);

// Sort
std::sort(
    words.begin(), words.end(),
    [&m](const std::string & lhs, const std::string & rhs)
    { return m.find(lhs)->second < m.find(rhs)->second; });
//制作单词列表
向量词;
字.保留(m.size());
对于(const auto&p:m)单词。向后推(p.first);
//分类
排序(
words.begin(),words.end(),
[&m](常量标准::字符串和左侧,常量标准::字符串和右侧)
{返回m.find(lhs)->secondsecond;};

什么是
字表
?您是否遇到编译错误或运行时问题?你会犯什么错误?我们可以猜测,但如果你告诉我们会更好。它已经在地图中按字典顺序排序,将其移动到向量不会神奇地改变顺序。如果
wordList
std::vector
,该副本将起作用。否则,你需要做一些工作,将地图中的数据映射成一种可以存储到向量的形式。如果你真的需要一个向量,我认为对于你提出的问题来说,构建一个频率到单词的std::multimap会更好。抱歉。wordList是我当前尝试使用的向量。它是向量。它给了我100个关于指针和不同东西的错误,我想我用错了这些容器。我还需要按数字排序,而不是按字母排序什么是
单词列表
?您是否遇到编译错误或运行时问题?你会犯什么错误?我们可以猜测,但如果你告诉我们会更好。它已经在地图中按字典顺序排序,将其移动到向量不会神奇地改变顺序。如果
wordList
std::vector
,该副本将起作用。否则,你需要做一些工作,将地图中的数据映射成一种可以存储到向量的形式。如果你真的需要一个向量,我认为对于你提出的问题来说,构建一个频率到单词的std::multimap会更好。抱歉。wordList是我当前尝试使用的向量。它是向量。它给了我100个关于指针和不同东西的错误,我想我用错了这些容器。我还需要按数字排序,而不是按字母排序