隨筆之~ << 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/5ios

 

 

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

 

 

 

//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類定義以下:spa

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

public:
    int age; // 年齡
};orm

那麼如何用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
}
這樣就實現了需求。ci

有人說,若是我有本身定義的「相等」呢?例如,有一個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,這是一個很大的數,其值不須要知道

相關文章
相關標籤/搜索