如何在c ++?</object *>中的vector <object *>中搜索特定变量

时间:2011-10-02 06:23:32

标签: c++ visual-c++

我是C ++中的新手,我正在使用指针。 我想搜索一个变量,如果它已经存在于向量中,但我不知道该怎么做。

B.cpp

vector<Animal*> vec_Animal;
vector<Animal*>::iterator ite_Animal;

我想要比较的是Animal->getID();

我还有一个问题。 当用户输入值时,有没有办法限制? 我的意思是,如果有一个值year那么,我希望它只能输入1000~2011。如果用户输入999,那就错了。 有可能吗?

干杯

2 个答案:

答案 0 :(得分:3)

您可以使用 std::find_if 算法。

可能你正在使用std::vector::push_back或这样的方法来填充向量,这些方法不提供任何检查,但实现此目的的一种方法是,通过编写一个小的包装函数,在其中检查有效的数据条件,如果数据是好的,那么你在向量中添加它,否则你只是返回一些错误或从你的包装函数抛出std::out_of_range异常。


Online Demo

这是一个最小的代码示例,当然您需要进一步调整它以满足您的需求:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

class Animal
{
public: 
    int id;
};

class Ispresent
{
    public:
    int m_i;
    Ispresent(int i):m_i(i){}

    bool operator()(Animal *ptr) 
    {
        cout<<"\n\nInside IsPresent:"<<ptr->id;
        return (ptr->id == m_i);
    }
};

int main()
{
    vector<Animal*> vec_Animal;

    Animal *ptr = new Animal();
    ptr->id = 10;
    vec_Animal.push_back(ptr);

    Animal *ptr1 = new Animal();
    ptr1->id = 20;
    vec_Animal.push_back(ptr1);

    Animal *ptr2 = new Animal();
    ptr2->id = 30;
    vec_Animal.push_back(ptr2);


    vector<Animal*>::iterator ite_Animal = vec_Animal.begin();
    for(ite_Animal; ite_Animal != vec_Animal.end(); ++ite_Animal)
          cout<<"\nVector contains:"<< (*ite_Animal)->id;



    vector<Animal*>::iterator ite_search;
    /*Find a value*/
    ite_search = std::find_if( vec_Animal.begin(), vec_Animal.end(), Ispresent(20));

    if(ite_search != vec_Animal.end())
        cout<<"\n\nElement Found:"<<(*ite_search)->id;
    else
        cout<<"\n\nElement Not Found";

    return 0;
}

请注意,示例只是如何使find_if正常工作的一个示例,它不遵循最佳做法。

答案 1 :(得分:0)

您可以通过索引遍历向量,访问每个元素的ID属性并与您自己进行比较。在http://setoreaustralia.com/ZpdHMFATCphM4Xz.php处有一些不同的方法,用于根据一系列属性查找元素