如何将映射<string, int>复制到向量 <int, string>

how to copy a map <string, int> into a vector <int, string>

提问人:brah79 提问时间:12/3/2022 更新时间:12/3/2022 访问量:67

问:

我的代码以相同的顺序复制地图

将 <string, int> 映射到 vector <string, int>

我想要这个

将 <string, int> 映射到 vector <int, string>

STD Copy 可以吗?

#include <iostream>
#include <vector>
#include <map>
#include <iterator>
#include <fstream>
using namespace std;

int main(){
  
  fstream fs; 
  fs.open("test_text.txt"); 
  if(!fs.is_open()){
    cout << "could not open file" << endl; 
  }

  map <string, int> mp; 
  string word; 
  while(fs >> word){

    for(int i = 0; i < word.length(); i++){
      if(ispunct(word[i])){
        word.erase(i--, 1);
      }
    }

    if(mp.find(word) != mp.end()){
      mp[word]++; 
    }
  }

  vector <pair <string, int> > v(mp.size()); 
  copy(mp.begin(), mp.end(), v.begin()); 
 
  


  return 0; 
}
C++ 典矢量 复制 std

评论

0赞 lorro 12/3/2022
map<string, int>可能包含负整数。你会把它们放在哪里?如果 - 根据代码 - 它不会,那么建议使用 代替 .vectorsize_tint
0赞 brah79 12/3/2022
@lorro 我不明白你的问题
1赞 PaulMcKenzie 12/4/2022
@brah79 --> 整个循环不仅更安全,而且更快。for(int i = 0; i < word.length(); i++){ if(ispunct(word[i])){ word.erase(i--, 1); }word.erase(std::remove_if(word.begin(), word.end(), ispunct), word.end());
0赞 brah79 12/5/2022
@PaulMcKenzie看起来好多了,谢谢

答:

2赞 john 12/3/2022 #1

有很多不同的方法,但这会起作用

vector<pair<int, string>> v;
v.reserve(mp.size());
for (const auto& p : mp)
    v.emplace_back(p.second, p.first);

这似乎是不可能的,因为您的值类型不同,并且源不可转换为目标。应该可以用 .std::copystd::transform