C++ 在地图上查找时出现问题

C++ 在地图上查找时出现问题,c++,boost,C++,Boost,我试图在std::map上使用std::find_if,查找与字符串匹配的特定对象,如下所示: class MyString { public: MyString() {} MyString(const std::string& x) : m_x(x) {} const std::string& value() const { return m_x; } private: std::string m_x;

我试图在std::map上使用std::find_if,查找与字符串匹配的特定对象,如下所示:

class MyString
{
public:
    MyString() {}
    MyString(const std::string& x) : m_x(x) {}
    const std::string& value() const
    {
            return m_x;
    }

private:
    std::string m_x;
};

std::map<int,MyString> squaresS;
std::map<int,MyString>::iterator iIt;

squaresS[1] = MyString("1");
squaresS[2] = MyString("4");
squaresS[3] = MyString("9");
const std::string sTarget = "4";

iIt = std::find_if(squaresS.begin(), squaresS.end(),
    boost::bind(std::equal_to<std::string>(),
        boost::bind(&MyString::value,
            boost::bind(&std::map<int,MyString>::value_type::second, _1)),
        sTarget));

if (iIt != squaresS.end())
    std::cout << "Found " << iIt->second.value() << std::endl;
else
    std::cout << "Not Found" << std::endl;
类MyString
{
公众:
MyString(){}
MyString(const std::string&x):m_x(x){}
常量std::字符串和值()常量
{
返回m_x;
}
私人:
std::字符串m_x;
};
地图平方;
std::map::迭代器iIt;
平方[1]=MyString(“1”);
平方[2]=MyString(“4”);
平方[3]=MyString(“9”);
常量std::string sTarget=“4”;
iIt=std::find_if(squares.begin(),squares.end(),
boost::bind(std::equal_to(),
boost::bind(&MyString::value),
boost::bind(&std::map::value_type::second,_1)),
明星);
如果(iIt!=squares.end())

std::cout以下是您可以做的:

class MyString
{
public:
    MyString() {}
    MyString(const std::string& x) : m_x(x) {}
    const std::string& value() const
    {
            return m_x;
    }

private:
    std::string m_x;
};

class mystringmatch
{
   MyString _target;
public:
   mystringmatch(const MyString& target):_target(target)
   {
   }

   bool operator()(const std::pair<int, MyString>& src) const
   {
      return src.second.value() == _target.value();
   }
};

int _tmain(int argc, _TCHAR* argv[])
{
   std::map<int,MyString> squaresS;
   std::map<int,MyString>::iterator iIt;

   squaresS[1] = MyString("1");
   squaresS[2] = MyString("4");
   squaresS[3] = MyString("9");
   const std::string sTarget = "4";

   iIt = std::find_if(squaresS.begin(), squaresS.end(), mystringmatch(sTarget));

   if (iIt != squaresS.end())
       std::cout << "Found " << iIt->second.value() << std::endl;
   else
       std::cout << "Not Found" << std::endl;

    return 0;
}
类MyString
{
公众:
MyString(){}
MyString(const std::string&x):m_x(x){}
常量std::字符串和值()常量
{
返回m_x;
}
私人:
std::字符串m_x;
};
类mystringmatch
{
MyString_目标;
公众:
mystringmatch(const MyString&target):\u target(target)
{
}
bool运算符()(const std::pair&src)const
{
返回src.second.value();
}
};
int _tmain(int argc,_TCHAR*argv[]
{
地图平方;
std::map::迭代器iIt;
平方[1]=MyString(“1”);
平方[2]=MyString(“4”);
平方[3]=MyString(“9”);
常量std::string sTarget=“4”;
iIt=std::find_if(squares.begin()、squares.end()、mystringmatch(sTarget));
如果(iIt!=squares.end())

std::cout以下是您可以做的:

class MyString
{
public:
    MyString() {}
    MyString(const std::string& x) : m_x(x) {}
    const std::string& value() const
    {
            return m_x;
    }

private:
    std::string m_x;
};

class mystringmatch
{
   MyString _target;
public:
   mystringmatch(const MyString& target):_target(target)
   {
   }

   bool operator()(const std::pair<int, MyString>& src) const
   {
      return src.second.value() == _target.value();
   }
};

int _tmain(int argc, _TCHAR* argv[])
{
   std::map<int,MyString> squaresS;
   std::map<int,MyString>::iterator iIt;

   squaresS[1] = MyString("1");
   squaresS[2] = MyString("4");
   squaresS[3] = MyString("9");
   const std::string sTarget = "4";

   iIt = std::find_if(squaresS.begin(), squaresS.end(), mystringmatch(sTarget));

   if (iIt != squaresS.end())
       std::cout << "Found " << iIt->second.value() << std::endl;
   else
       std::cout << "Not Found" << std::endl;

    return 0;
}
类MyString
{
公众:
MyString(){}
MyString(const std::string&x):m_x(x){}
常量std::字符串和值()常量
{
返回m_x;
}
私人:
std::字符串m_x;
};
类mystringmatch
{
MyString_目标;
公众:
mystringmatch(const MyString&target):\u target(target)
{
}
bool运算符()(const std::pair&src)const
{
返回src.second.value();
}
};
int _tmain(int argc,_TCHAR*argv[]
{
地图平方;
std::map::迭代器iIt;
平方[1]=MyString(“1”);
平方[2]=MyString(“4”);
平方[3]=MyString(“9”);
常量std::string sTarget=“4”;
iIt=std::find_if(squares.begin()、squares.end()、mystringmatch(sTarget));
如果(iIt!=squares.end())

std::cout正如其他人所指出的,您的代码已经适用于我(VC++2010 SP1)。也就是说,有一个小小的改变可以减少嵌套的
bind
s的数量--
boost::bind
的返回类型(与
std::bind
的返回类型不同)让所有关系运算符和逻辑运算符重载,包括
运算符==
,从而避免(或至少减轻)对适配器的需求,如
std::equal_to
。利用这一点可以将代码简化为:

typedef std::map<int, MyString> squares_t;
squares_t::const_iterator iIt = std::find_if(
    squaresS.begin(),
    squaresS.end(),
    boost::bind(
        &MyString::value,
        boost::bind(&squares_t::value_type::second, ::_1)
    ) == sTarget
);
typedef std::map squares\t;
平方:常量迭代器iIt=std::查找(
squares.begin(),
squares.end(),
boost::bind(
&MyString::value,
boost::bind(&squares\u t::value\u type::second,:\u 1)
)==明星
);

有关更多信息,请参阅。

正如其他人所指出的,您的代码已经适用于我(VC++2010 SP1)。也就是说,可以做一个小小的更改来减少嵌套的
bind
s的数量——
boost::bind
的返回类型(与
std::bind
的返回类型不同)让所有关系运算符和逻辑运算符重载,包括
运算符==
,从而避免(或至少减轻)对适配器的需求,如
std::equal_to
。利用这一点可以将代码简化为:

typedef std::map<int, MyString> squares_t;
squares_t::const_iterator iIt = std::find_if(
    squaresS.begin(),
    squaresS.end(),
    boost::bind(
        &MyString::value,
        boost::bind(&squares_t::value_type::second, ::_1)
    ) == sTarget
);
typedef std::map squares\t;
平方:常量迭代器iIt=std::查找(
squares.begin(),
squares.end(),
boost::bind(
&MyString::value,
boost::bind(&squares\u t::value\u type::second,:\u 1)
)==明星
);

有关更多信息,请参阅。

无关评论:有时我只是惊讶于一个人会被这种可怕的不可读语法一步一步地陶醉。这可能是一个关于boost的沸沸扬扬的故事。@6502,我听说你…一个简单的函子比这个绑定魔法更容易理解…
实际上你上面为
MyString
编写的代码对我来说是有效的:,不过你还是应该添加一个合适的副本构造函数!@Nim:同意。C++0x实际上就在这里,而且没有什么理由避免新代码中的新特性。当然,我有点担心人们会用
算法和lambdas编写这种代码当为
编写一个
就足够了:想想jQuery对JavaScript开发做了什么,你就会明白我的意思。你为MyString编写的代码对我来说也适用于gcc-4.2.1相关评论:有时我只是惊讶于一个人会被这种可怕的不可读语法一步一步地陶醉。有点像沸腾大概是关于boost的故事。@6502,我听说你…一个简单的函子会更容易理解这个绑定魔法…
实际上你上面的代码对于
MyString
对我来说是有效的:,不过你还是应该添加一个合适的副本构造函数!@Nim:同意。C++0x实际上就在这里,而且没有什么值得注意的地方当然,我有点担心当
for
足够时人们会用
算法和lambdas编写这样的代码:想想jQuery对JavaScript开发做了什么,你就会明白我的意思。你的MyString代码对我来说也适用于我使用的gcc-4.2.1Thanks我想是VC++2005编译这个so的时候升级了!我喜欢你使用operator()==。谢谢,我是用VC++2005编译这个so的时候升级的!我喜欢你使用operator()==。