C++のvector&find_if



vector&find_if
Cというstructが次のように聞かれたのを見た.
code:
   
struct C
{
   int v1;
   int v2;
};

   

vector中国式に適用してvectorcvと宣言する.
内部要素を検索する場合はどうすればいいですか?
一般的な解法はfor()ループを線行として探すのが一般的ですが、実は直感的で簡単です.
ここではもう一つの簡易解法を提供する....
find_if()の3番目のパラメータは判断式の入力を提供するが,残念ながら1つのパラメータしか入力できない.
また、サンプル値のペアではなく*iteratorのタイプが入力されます.
例えばこのcvの中の物のv 1,v 2は順番に
v1 v2
1 100
2 52
3 25
4 75
5 84
6 33
では、v 2=75の物件を探すにはどうすればいいですか?
1.functor point
code:
   
bool Cfind75(const C& obj)
{
        return obj.v2==75;
}

   

2.functor
code:
   
class Cfind75{
       public:
          bool operator()(const C& obj)
          {
               return obj.v2==75;
          }
};

   

しかしこのように比较する値は书かれて死にました!!
そう...だからこの时templateは役に立ちました....
だから私たちは書き直しました
code:
   
template<int n>
class CComp{
    public:
        bool operator()(const C& lhs)
        {
            return (lhs.v2==n);
        }
};

   

どのように使いますか?简単です....
code:
   
vector<C>::iterator cviter = 
        find_if(cv.begin(),cv.end(),CComp<75>());

   

cviterは,cv中のC型別物のv 2値が75に戻った位置である.簡単なアプリケーションで、大学の質問もありません.しかし、STLに詳しくない人は無視することが多い.
  • #include 

  • #include 
  • #include 

  • #include 

  • using namespace std;

  • struct C
  • {

  •    C():v1(0),v2(0){}
  •    C(const int& val1,const int& val2):v1(val1),v2(val2){}

  •    C operator()(const int& val1,const int& val2)
  •    {

  •       v1=val1;
  •       v2=val2;

  •       return *this;
  •    }

  •    ~C(){}
  •    int v1;

  •    int v2;
  • };

  • template
  • class CComp{

  •     public:
  •         bool operator()(const C& lhs)

  •         {
  •             return (lhs.v2==n);

  •         }
  • };

  • int main(int argc, char *argv[])

  • {
  •     vector cv;

  •     C val;
  •     cv.push_back(val(1,100));

  •     cv.push_back(val(2,52));
  •     cv.push_back(val(3,25));

  •     cv.push_back(val(4,75));
  •     cv.push_back(val(5,84));

  •     cv.push_back(val(6,33));
  •     

  •     vector::iterator cviter = 
  •         find_if(cv.begin(),cv.end(),CComp<75>());

  •     cout<v1<<"  "<v2<
  •     cout<
        
  •     system("PAUSE");    

  •     return 0;
  • }