2011-12-03 37 views
0

VC++ 2010定位/使用基於向量的關閉一個其元素

可以說我有以下內容:

struct person { 
    char * name; 
    int  age; 
}; 

然後,我必須保持它們的矢量:

std::vector <person> person_list; 

現在,在將這些元素中的一些元素推回後,如何根據其屬性之一找到一個元素?最好的情況下,我希望它返回一個指向矢量元素'where name = string'類型的交易的指針。

回答

1

一個改進的建議。使用std::string而不是char*。你必須爲#include <string>

  • 在C++ 11可以使用LAMDA和std::find_if爲:

    #include <algorithm> 
    
    auto it = std::find_if(persons.begin(), persons.end(), [](const person & p) 
              { 
               return p.name = "string"; 
              }); 
    
  • 在C++ 03,你可以用仿作謂語:

    #include <algorithm> 
    
    struct name_predicate 
    { 
        std::string name; 
        name_predicate(std::string const & name) : name(name) {} 
        bool operator()(person const & p) { return name == p.name; } 
    }; 
    
    std::vector<person>::iterator it = std::find_if(persons.begin(), 
                   persons.end(), 
                   name_predicate("string")); 
    
+0

我卡與VC2010,應該提到。 – grep

+0

,因爲它似乎我缺少std :: find。這僅在2011年的STL中可用嗎? – grep

+0

@Headspin:號碼#包括' – Nawaz

2

(請使用std::string代替char*以避免泄漏或晃動指針。)

你可以使用std::find_if得到一個迭代該元素:

#include <algorithm> // allow us to use std::find_if 

struct NameFinder 
{ 
    std::string target; 
    bool operator()(const person& pers) const 
    { 
     return pers.name == target; 
    } 
}; 

... 

NameFinder finder; 
finder.target = "whatever name you want"; 

std::vector<person>::iterator it = 
       std::find_if(person_list.begin(), person_list.end(), finder); 

std::cout << "name = " << it->name << "; age = " << it->age << std::endl; 

這裏是的NameFinder一個函數對象,檢查如果一個人的名字給定的目標相匹配。

+0

忘了提及我堅持與vC++ 2010 – grep

+1

@Headspin:這是C++ 03,所以VC++ 2010肯定會工作。實際上,VC++ 2010已經支持lambda函數,所以Nawaz的解決方案也可以工作。 – kennytm

+0

任何想法,爲什麼我會得到'錯誤:命名空間「標準」沒有成員「find_if」'? – grep

1

stdlib使用迭代器而不是指針。在algorithm標題中,您可以找到功能模板findfind_if。第一個按值標識搜索元素,第二個搜索謂詞並返回iterator到第一個匹配項。你可以爲operator==添加一個超負荷給你的人類,並使用第一個版本或寫一個謂詞,並與第二個版本一起去。

下面是一個例子謂詞:

struct person_equal { 
    bool operator()(const person& p, const char* name) { 
    return strcmp(p.name, name); 
    } 
}; 

注意,它使用了C-功能strcmp。您應該將std::stringS存儲在您的person對象中,而不是char*

現在,這個謂詞需要兩個元素,但find_if需要一個單一的謂詞。您需要將bind的第二個參數設置爲某個固定值。這裏我使用已棄用的bind2nd。您應該使用boost:::bind或C++ TR1替換。

std::find_if(vec.begin(), vec.end(), std::bind2nd(person_equal(), "foobar")); 

在C++ 0x中,你會使用lambda:

std::find_if(v.begin(), v.end(), [](const person& p) { return strcmp(p.name, "foobar"); }); 

或者你可以遍歷:

std::vector<person>::iterator my_find(std::vector<person>& v) { 
    for(std::vector<person>::iterator it = v.begin(), it != v.end(), ++it) { 
    if(strcmp(it->name, "foobar")) return it; 
    } 
} 
+0

當兩個字符串* *不相等時,strcmp會返回一個真值('!= 0')... – kennytm

相關問題