VC++ 2010定位/使用基於向量的關閉一個其元素
可以說我有以下內容:
struct person {
char * name;
int age;
};
然後,我必須保持它們的矢量:
std::vector <person> person_list;
現在,在將這些元素中的一些元素推回後,如何根據其屬性之一找到一個元素?最好的情況下,我希望它返回一個指向矢量元素'where name = string'
類型的交易的指針。
VC++ 2010定位/使用基於向量的關閉一個其元素
可以說我有以下內容:
struct person {
char * name;
int age;
};
然後,我必須保持它們的矢量:
std::vector <person> person_list;
現在,在將這些元素中的一些元素推回後,如何根據其屬性之一找到一個元素?最好的情況下,我希望它返回一個指向矢量元素'where name = string'
類型的交易的指針。
一個改進的建議。使用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"));
(請使用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一個函數對象,檢查如果一個人的名字給定的目標相匹配。
stdlib使用迭代器而不是指針。在algorithm
標題中,您可以找到功能模板find
和find_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;
}
}
當兩個字符串* *不相等時,strcmp會返回一個真值('!= 0')... – kennytm
我卡與VC2010,應該提到。 – grep
,因爲它似乎我缺少std :: find。這僅在2011年的STL中可用嗎? – grep
@Headspin:號碼#包括' –
Nawaz