C++ C++;从地图中删除标点符号

C++ C++;从地图中删除标点符号,c++,C++,我制作了一个程序,读取一个文本文档,将其放入一个向量中,并使用该向量作为一个地图来跟踪文本文件中的单词及其频率。所有这些都很好,但是需要帮助从地图中删除标点符号。以下是我现在拥有的: #include<iostream> #include<string> #include<map> #include<algorithm> #include<vector> #include<fstream> using namespace s

我制作了一个程序,读取一个文本文档,将其放入一个向量中,并使用该向量作为一个地图来跟踪文本文件中的单词及其频率。所有这些都很好,但是需要帮助从地图中删除标点符号。以下是我现在拥有的:

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

void print_frequency(vector<string>&);


int main()
{
    ifstream infile;
    string word;
    vector<string>words;
    infile.open("words.txt");
    if (infile.fail()) {
        cerr << "Can't open file\n";
        exit(1);
    }
    while (infile >> word) {
        
        words.push_back(word);
    }
    
    print_frequency(words);
}

void print_frequency(vector<string>&words)
{
    map<string, int>M;
    for (int i = 0; i<words.size(); i++) {
        if (M.find(words[i]) == M.end())
            M[words[i]] = 1;
        else
            M[words[i]]++;
        
    }
    sort(words.begin(), words.end());
    for (auto it = M.begin(); it != M.end();it++) {
        
        if (ispunct(M[it->first]))
        {
            M[it->first].erase(it--, 1);
            int len = M.size();
        }
        cout << it->first << " " << it->second << endl;
    }
    
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
无效打印频率(矢量和);
int main()
{
河流充填;
字符串字;
矢量词;
infle.open(“words.txt”);
if(infle.fail()){
cerr>word){
单词。推回(单词);
}
打印频率(字);
}
无效打印频率(矢量和文字)
{
mapM;
对于(int i=0;ifirst]))
{
M[it->first]。擦除(it--,1);
int len=M.size();
}

首先是的,可能应该尽快删除标点符号,否则以后它会变得不必要的复杂。我能够让它工作

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

void print_frequency(vector<string>&);


int main()
{
    ifstream infile;
    string word;
    vector<string>words;
    infile.open("words.txt");
    if (infile.fail()) {
        cerr << "Can't open file\n";
        exit(1);
    }
    while (infile >> word) {
        for (int i = 0; i < word.size(); i++)
        {
            if (ispunct(word[i]))
            {
                word.erase(i--, 1);
                
            }
        }
        words.push_back(word);
    }
    
    print_frequency(words);
}

void print_frequency(vector<string>&words)
{
    map<string, int>M;
    for (int i = 0; i<words.size(); i++) {
        if (M.find(words[i]) == M.end())
            M[words[i]] = 1;
        else
            M[words[i]]++;
        
    }
    sort(words.begin(), words.end());
    for (auto it = M.begin(); it != M.end();it++) {
        
        cout << it->first << " " << it->second << endl;
    }
    
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
无效打印频率(矢量和);
int main()
{
河流充填;
字符串字;
矢量词;
infle.open(“words.txt”);
if(infle.fail()){
cerr>word){
for(int i=0;i对于(int i=0;i,正如其他人所说,最好的办法似乎是在阅读后立即删除这些字符。为此,我选择
std::regex
库:

while (infile >> word) {
    std::string new_word = std::regex_replace(word, std::regex(R"([^A-Za-z\d])"), "");
    words.push_back(new_word);
}

“([^A-Za-z\d])”
指的是一种模式,它不是(
^
)字母(
A-Za-z
)而不是数字(
\d
)。当然,你可以修改它以适应你的严格需要,我鼓励你熟悉正则表达式语法。

对于你来说,代码是不必要的复杂(而且效率低下)
(int i=0;在将字符串添加到地图之前删除标点符号不是更有意义吗?