我正在研究一个程序,该程序使用来查看特定单词是否是一个字谜,std:count但我认为我的函数逻辑不正确,而且似乎无法弄清楚。
std:count
假设文件中包含以下单词:
Evil Vile Veil Live
我的代码如下:
#include <iostream> #include <vector> #include <fstream> #include <map> using namespace std; struct Compare { std::string str; Compare(const std::string& str) : str(str) {} }; bool operator==(const std::pair<int, std::string>&p, const Compare& c) { return c.str == p.second; } bool operator==(const Compare& c, const std::pair<int, std::string>&p) { return c.str == p.second; } std::vector<std::string> readInput(ifstream& file) { std::vector<std::string> temp; string word; while (file >> word) { temp.push_back(word); } std::sort(temp.begin(), temp.end()); return temp; } int main(int argc, char *argv[]) { string file = "testing.txt"; ifstream ss(file.c_str()); if(!ss.is_open()) { cerr << "Cannot open the text file"; } std::vector<std::string> words = readInput(ss); std::map<int, std::string> wordsMap; //std::map<std::string value, int key> values; for(unsigned i=0; (i < words.size()); i++) { wordsMap[i] = words[i]; } int count = std::count(wordsMap.begin(), wordsMap.end(), Compare("Evil")); cout << count << endl; }
我很确定这只是我的逻辑在函数中出错的一种情况。我希望有人能帮帮忙 :)
最简单的方法是
进行如下检查(伪代码)
bool isAnagram(string s, string t) {return sort(s) == sort(t); }
因此,请使用以下想法,无需 std::map
std::map
struct Compare { std::string str; Compare(const std::string& x) : str(x) { std::sort(str.begin(),str.end()); std::transform(str.begin(), str.end(),str.begin(), ::toupper);} bool operator ()(const std::string& t) { std::string s= t; std::transform(s.begin(), s.end(),s.begin(), ::toupper); std::sort(s.begin(),s.end()); return s == str; } };
然后
int count = std::count_if(words.begin(), words.end(), Compare("Evil"));
见 这里