随笔之~ << find string.find

//1.string<<
stringstream ss;
ss.clear();
ss.str("");
ss << st.year <<st.month<<st.day; //int 2015 int 1 int 8
string strDate;
ss >> strDate; //strDate:201518
int iTimeId = st.hour*12 + st.minute/5

 

 

//2.位数
CString szTimeId;
szTimeId.Format("%d", 1000 + iTimeId);
string strTimeId(szTimeId.Right(3).GetBuffer()); //保证取到的是3位数

 

 

 

//3. find
STL的find,find_if函数提供了一种对数组、STL容器进行查找的方法。使用该函数,需 #include <algorithm>
我们查找一个list中的数据,通常用find(),例如:

using namespace std;
int main()
{
    list<int> lst;
    lst.push_back(10);
    lst.push_back(20);
    lst.push_back(30);
    list<int>::iterator it = find(lst.begin(), lst.end(), 10); // 查找list中是否有元素“10”
    if (it != lst.end()) // 找到了
    {
        // do something
    }
    else // 没找到
    {
        // do something
    }
    return 0;
}

那么,如果容器里的元素是一个类呢?例如,有list<CPerson> ,其中CPerson类定义如下:

class CPerson
{
public:
    CPerson(void);
    ~CPerson(void);

public:
    int age; // 年龄
};

那么如何用find()函数进行查找呢?这时,我们需要提供一个判断两个CPerson对象“相等”的定义,find()函数才能从一个list中找到与指定的CPerson“相等”的元素。
这个“相等”的定义,是通过重载“==”操作符实现的,我们在CPerson类中添加一个方法,定义为:
bool operator==(const CPerson &rhs) const;
实现为:
bool CPerson::operator==(const CPerson &rhs) const
{
    return (id == rhs.age);
}

然后我们就可以这样查找(假设list中已经有了若干CPerson对象)了:
list<CPerson> lst;
//////////////////////////////////
// 向lst中添加元素,此处省略
//////////////////////////////////
CPerson cp_to_find; // 要查找的对象
cp_to_find.age = 50;
list<CPerson>::iterator it = find(list.begin(), list.end(), cp_to_find); // 查找

if (it != lst.end()) // 找到了
{
    // do something
}
else // 没找到
{
    // do something
}
这样就实现了需求。

有人说,如果我有自己定义的“相等”呢?例如,有一个list<CPerson*>,这个list中的每一个元素都是一个对象的指针,我们要在这个list中查找具有指定age的元素,找到的话就得到对象的指针。
这时候,你不再能像上面的例子那样做,我们需要用到find_if函数,并自己指定predicate function(即find_if函数的第三个参数,请查阅STL手册)。先看看find_if函数的定义:
template<class InputIterator, class Predicate>
InputIterator find_if(InputIterator _First, InputIterator _Last, Predicate _Pred);
Parameters
_First
An input iterator addressing the position of the first element in the range to be searched.
_Last
    An input iterator addressing the position one past the final element in the range to be searched.
_Pred
    User-defined predicate function object that defines the condition to be satisfied by the element being searched for. A predicate takes single argument and returns true or false.


我们在CPerson类外部定义这样一个结构体:
typedef struct finder_t
{
    finder_t(int n) : age(n) { } bool operator()(CPerson *p) { return (age == p->age); } int age;
}finder_t;

然后就可以利用find_if函数来查找了:
list<CPerson*> lst;
//////////////////////////////////
// 向lst中添加元素,此处省略
//////////////////////////////////

list<CPerson*>::iterator it = find_if(lst.begin(), lst.end(), finder_t(50)); // 查找年龄为50的人
if (it != lst.end()) // 找到了
{
    cout << "Found person with age : " << (*it)->age;
}
else // 没找到
{
    // do something
}

 

 

 

// 4.string.find()

#include <string>
#include <iostream>
using namespace std;
void main()
{
    [cpp] view plaincopyprint?
     ////find函数返回类型 size_type  
    string s("1a2b3c4d5e6f7g8h9i1a2b3c4d5e6f7g8ha9i"); 
    string flag; 
    string::size_type position; 
     
    //find 函数 返回jk 在s 中的下标位置   
    position = s.find("jk"); 
    if (position != s.npos)  //如果没找到,返回一个特别的标志c++中用npos表示,我这里npos取值是4294967295,  
    { 
     cout << "position is : " << position << endl; 
    } 
    else 
    { 
     cout << "Not found the flag" + flag; 
    } 
 
[cpp]
1. //find 函数 返回flag 中任意字符 在s 中第一次出现的下标位置  
2.  flag = "c"; 
3.  position = s.find_first_of(flag); 
4.  cout << "s.find_first_of(flag) is : " << position << endl; 
[cpp]
1. //从字符串s 下标5开始,查找字符串b ,返回b 在s 中的下标  
2. position=s.find("b",5); 
3. cout<<"s.find(b,5) is : "<<position<<endl; 
[cpp]
1. //查找s 中flag 出现的所有位置。  
2.  flag="a"; 
3.  position=0; 
4.  int i=1; 
5.  while((position=s.find_first_of(flag,position))!=string::npos) 
6.  { 
7.   //position=s.find_first_of(flag,position);  
8.   cout<<"position  "<<i<<" : "<<position<<endl; 
9.   position++; 
10.   i++; 
11.  }     
[cpp]
1. //查找flag 中与s 第一个不匹配的位置  
2. flag="acb12389efgxyz789"; 
3. position=flag.find_first_not_of (s); 
4. cout<<"flag.find_first_not_of (s) :"<<position<<endl;    
[cpp]
1.  //反向查找,flag 在s 中最后出现的位置  
2.  flag="3"; 
3.  position=s.rfind (flag); 
4.  cout<<"s.rfind (flag) :"<<position<<endl;
5. } 

 说明:
1.  如果string sub = ”abc“;
              string s = ”cdeabcigld“;
     s.find(sub) , s.rfind(sub) 这两个函数,如果完全匹配,才返回匹配的索引,即:当s中含有abc三个连续的字母时,才返回当前索引。
     s.find_first_of(sub),   s.find_first_not_of(sub),   s.find_last_of(sub),  s.find_last_not_of(sub)  这四个函数,查找s中含有sub中任意字母的索引。
2.  如果没有查询到,则返回string::npos,这是一个很大的数,其值不需要知道


 

你可能感兴趣的:(<<,find,string.find)