• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

wektor objektow + find

Object Storage Arubacloud
0 głosów
136 wizyt
pytanie zadane 2 listopada 2019 w C i C++ przez kawapa Nowicjusz (210 p.)

Cześć,

Walczę od kilku godzin z algorytmem wyszukiwania konkretnego objektu (o konkretnej wartosci danego pola) w vectorze. Chcialbym potem taki element modyfikowac.
Wyczytałem już, że trzeba albo przeciążyć operator == albo użyć funkcji find_if, ale poległem przy obu wariantach. Pokazałby ktoś jak to mogłoby wyglądać?

Kod programu:

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

using namespace std;

class Person {
public:
    string name;
    int number;
public:
    Person(string name, int number) : name(name), number(number) { }
    ~Person() {}
};

int main()
{
    vector<Person> wektor;

    wektor.push_back(Person("Marek", 555));
    wektor.push_back(Person("Robert", 123));

    for (vector<Person>::iterator it = wektor.begin(); it != wektor.end(); it++)
        cout << it->name << " " << it->number << endl;

    auto it2 = find_if(wektor.begin(); wektor.end(); this->name == 555);

    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 2 listopada 2019 przez RafalS VIP (122,820 p.)
wybrane 12 listopada 2019 przez kawapa
 
Najlepsza

Zacznijmy od tego, że oddzielasz argumenty wywołania funkcji srednikami a nie przecinkami:

    auto it2 = find_if(wektor.begin(); wektor.end(); this->name == 555);

W przypadku find_if musisz podać predykat - coś co przy wywołaniu:

predykat(*element_wektora)

zwróci bool. Jest kilka opcji:

  • lambda
  • zwykła funkcja
  • obiekt z przeciążonym operatorem wywołania
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Person
{
public:
	string name;
	int number;

public:
	Person(string name, int number) : name(name), number(number) {}
	~Person() {}
};

bool pred(const Person &p)
{
	return p.number == 555;
}
struct pred_struct
{
	bool operator()(const Person &p)
	{
		return p.number == 555;
	}
};

int main()
{
	vector<Person> wektor;

	wektor.push_back(Person("Marek", 555));
	wektor.push_back(Person("Robert", 123));

	for (vector<Person>::iterator it = wektor.begin(); it != wektor.end(); it++)
		cout << it->name << " " << it->number << endl;

	auto lambda = find_if(wektor.begin(), wektor.end(),
						  [](const Person &p) { return p.number == 555; });
	auto function = find_if(wektor.begin(), wektor.end(), pred);
	auto object = find_if(wektor.begin(), wektor.end(), pred_struct{});
	std::cout << lambda->name << std::endl;
	std::cout << function->name << std::endl;
	std::cout << object->name << std::endl;
}

 

0 głosów
odpowiedź 2 listopada 2019 przez Michałełe Nałogowiec (25,600 p.)

Witam

Naklepałem coś takiego:

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

using namespace std;

class Person {
public:
	string name;
	int number;
// public:
	Person(string name, int number) : name(name), number(number) { }
	~Person() {}

	bool operator ==(string s) {	
		return s == this->name;
	}

	bool operator ==(int s) {
		return s == this->number;
	}
};

bool equal( Person i) {
	return i.number == 555;
}

int main()
{
	vector<Person> wektor;

	wektor.push_back(Person("Marek", 555));
	wektor.push_back(Person("Robert", 123));

	for (vector<Person>::iterator it = wektor.begin(); it != wektor.end(); it++)
		cout << it->name << " " << it->number << endl;

	// Z uzyciem ==
	for (vector<Person>::iterator it = wektor.begin(); it != wektor.end(); it++)
		if (*it == "Marek") {
			cout << it->name << " " << it->number << endl;
		}
		//if(*it == 123){
		//	cout << it->name << " " << it->number << endl;
		//}
	

	auto it2 = find_if( wektor.begin(), wektor.end(), equal);

	cout << it2->name;

	return 0;
}

Dodałem przeładowanie operatora == dla int'ów i string'ów.

Jeszcze dodałem funkcję do find_if.

Jakbyś miał jakieś pytania to pisz :)

Podobne pytania

0 głosów
1 odpowiedź 129 wizyt
pytanie zadane 25 marca 2020 w C i C++ przez AlpenGod Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 902 wizyt
pytanie zadane 10 stycznia 2020 w C i C++ przez Tymot372 Nowicjusz (220 p.)
0 głosów
1 odpowiedź 106 wizyt
pytanie zadane 11 października 2020 w C i C++ przez TlenekWodoru Użytkownik (520 p.)

92,584 zapytań

141,434 odpowiedzi

319,671 komentarzy

61,968 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...