我现在正在教自己c ++,所以我很新。我正在学习的书中的一个问题是要求比较2个字符串的二元谓词。下面我复制了我写的内容。我确信这是一个非常简单的解决方案,但我自己无法弄清楚。基本上,我的错误在if语句中。当匹配时,它总是打印出第一个元素而不是匹配的元素。你能帮忙解释一下为什么吗?我究竟做错了什么?另外,作为一个新手,如果你看到任何“丑陋的代码”并且可以识别出你要写的不同以便我可以清理它,我会很感激。谢谢!
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
//my comparison predicate starts here
struct comparison{
string deststring1;
string deststring2;
comparison (const string& whattheyenter){
deststring1.resize(whattheyenter.size());
transform(whattheyenter.begin(),whattheyenter.end(),deststring1.begin(),tolower);
}
bool operator () (const string& string2) {
deststring2.resize(string2.size());
transform(string2.begin(),string2.end(),deststring2.begin(),tolower);
return (deststring1<deststring2);
}
};
//program begins here
int main(){
string comparethisstring;
cout<<"enter string to compare: "<<endl;
cin>>comparethisstring;
vector<string> listofstrings;
listofstrings.push_back("my fiRst string");
listofstrings.push_back("mY sEcond striNg");
listofstrings.push_back("My ThIrD StRiNg");
auto ielement = find_if(listofstrings.begin(),listofstrings.end(),comparison(comparethisstring));
if (ielement!=listofstrings.end()){
// when there is a match this always prints "my fiRst string" instead of
// pointing to the element where the match is.
cout<<"matched:" <<*ielement;
}
else {
cout<<"no match found!";
}
return 0;
}
编辑:只是想说问题是,首先,我使用了一个小于运算符,这对于比较相等是没有用的。其次,我用cin而不是getline。结果当我输入“我的第一个字符串”cin时,只分配了“my”来比较这个字符串。谢谢大家的帮助!
答案 0 :(得分:1)
find_if
找到预测为true
的第一个元素。您的预测是“它是按字母顺序提前的,而不是comparethisstring
。当且仅当您等于comparethisstring
(或deststring1==deststring2
)时,您可能希望返回true。
我还建议将deststring2
变为operator()
方法的本地变量。