Как я могу найти конкретную переменную в векторе <Object *> в C ++? - PullRequest
4 голосов
/ 02 октября 2011

Я новичок в vector в C ++, и я использую указатель в нем. Я бы хотел найти переменную, если она уже существует в векторе, но я не уверен, как это сделать.

B.cpp

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

Я пытаюсь сравнить это Animal->getID();

И у меня есть еще один вопрос. Есть ли способ сделать ограничение, когда пользователь вводит значение? Я имею в виду, что если есть значение year, я хочу, чтобы оно было напечатано только 1000 ~ 2011. Если пользователь поставит 999, это будет неправильно. Возможно ли это?

Приветствия

Ответы [ 2 ]

3 голосов
/ 02 октября 2011

Вы можете использовать алгоритм std :: find_if .

Возможно, вы используете std::vector::push_back или такие методы для заполнения вектора. Эти методы не предоставляют никаких проверок, но один из способов сделать это - написать небольшую функцию-обертку, внутри которой вы проверяетедля действительных условий данных, и если данные хороши, то вы добавляете это в вектор, иначе вы просто возвращаете какую-то ошибку или выбрасываете std::out_of_range исключение из вашей функции-оболочки.


Демонстрация в Интернете

Вот пример мини-эластичного кода, конечно, вам нужно будет настроить его под свои нужды:

#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 работать, это не соответствует лучшим практикам.

0 голосов
/ 04 октября 2011

Вы можете просто перемещаться по вектору по индексу, получая доступ к свойству ID каждого элемента и сравнивая с вашим собственным.Есть несколько различных способов сделать это на http://setoreaustralia.com/ZpdHMFATCphM4Xz.php, которые предназначены для поиска элемента на основе ряда свойств

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...