迭代器指向“find_if”匹配后的第一个元素,为什么?

时间:2012-12-18 00:45:32

标签: c++

我现在正在教自己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”来比较这个字符串。谢谢大家的帮助!

1 个答案:

答案 0 :(得分:1)

find_if找到预测为true的第一个元素。您的预测是“它是按字母顺序提前的,而不是comparethisstring。当且仅当您等于comparethisstring(或deststring1==deststring2)时,您可能希望返回true。

我还建议将deststring2变为operator()方法的本地变量。