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

Jak dynamicznie tworzyć element wektora, który jest strukturą?

Object Storage Arubacloud
0 głosów
363 wizyt
pytanie zadane 18 grudnia 2015 w C i C++ przez Plessio Obywatel (1,090 p.)

Witam, aktualnie mam napisany programik, który dodaje elementy do wektora w taki o to sposób:

case '2':
		{		

			Student nowy;


			cout << "Podaj imie: ";
			cin >> nowy.imie;
			cout << "Podaj nazwisko: ";
			cin >> nowy.nazwisko;
			cout << "Podaj ocene: ";
			cin >> nowy.ocena;
			lista.push_back(nowy);

			break;
		}

Struktura:

struct Student
{
	string imie;
	string nazwisko;
	int ocena;
};

Wektor:

vector<Student> lista;

Jednak chciałbym zmienić to, aby dynamicznie w case 2 był tworzony nowy obiekt strukturalny, a nie za każdym razem w pętli "Student nowy", gdyż później mam problem w wyszukiwaniu tego studenta po nazwisku w case 3:

case '3':
		{
			vector<Student>::iterator it;
			string nazwisko;
			cout << "Szukane nazwisko: ";
			cin >> nazwisko;
			it = find(lista.begin(), lista.end(), nazwisko);
			if (it != lista.end())
			{
				cout << "Dane studenta: " << endl;
				cout << "Imie studenta: " << (*it).imie << endl;
				cout << "Nazwisko studenta: " << (*it).nazwisko << endl;
				cout << "Ocena studenta: " << (*it).ocena << endl;
			}
			else
				cout << "Nie ma studenta o podanym nazwisku!";

			break;
		}

Podejrzewam, że mogłoby to rozwiązać ten problem tylko nie mam pojęcia w jaki sposób to zrobić, próbowałem na wskaźnikach, ale nic się nie chciało kompilować.

1 odpowiedź

+1 głos
odpowiedź 18 grudnia 2015 przez adrian17 Ekspert (344,860 p.)
wybrane 18 grudnia 2015 przez Plessio
 
Najlepsza

Jednak chciałbym zmienić to, aby dynamicznie w case 2 był tworzony nowy obiekt strukturalny, a nie za każdym razem w pętli "Student nowy", gdyż później mam problem w wyszukiwaniu tego studenta po nazwisku w case 3:

To zdanie nie ma sensu.

Nie rozumiem co chcesz osiągnąć i co w obecnej metodzie jest nie tak. "Student nowy;" jest jak najbardziej poprawna i normalna.

Natomiast ta linia nie ma sensu:

find(lista.begin(), lista.end(), nazwisko);

Szukasz stringa w vectorze Studentów, to nie ma prawa działać. Albo musisz przeładować operator==, albo użyć std::find_if.

komentarz 18 grudnia 2015 przez Plessio Obywatel (1,090 p.)
Czyli mam zrobić funkcję sprawdzającą czy są takie same? Jak tutaj: http://cpp0x.pl/dokumentacja/standard-C++/find_if/323
komentarz 18 grudnia 2015 przez adrian17 Ekspert (344,860 p.)

No tak. Na oko coś takiego:

it = find(lista.begin(), lista.end(),
    [&](Student &student){ return student.nazwisko == nazwisko; }
);

 

komentarz 18 grudnia 2015 przez Plessio Obywatel (1,090 p.)

Szczerze mówiąc tego typu wyrażeń nie miałem, czy nie ma innego prostszego sposobu? Ale wracając już do tego mając taką funkcję:

bool wyszukiwarka(string nazwisko, vector<Student> lista, vector<Student>::iterator it)
{
	it = find(lista.begin(), lista.end(), [&](Student &student) { return student.nazwisko == nazwisko; }
}

Podkreśla mi ostatni " } " i nie wiem co z tym zrobić.

komentarz 18 grudnia 2015 przez adrian17 Ekspert (344,860 p.)

1. zrobiłem literówkę, find->find_if, 2. zgubiłeś ");" na końcu.

3. no tak, możesz osobno zdefiniować funkcję porówującą, dokładnie jak pokazali w linku który sam podałeś.

komentarz 18 grudnia 2015 przez Plessio Obywatel (1,090 p.)
Kolego sympatyczny dziękuję Ci bardzo za pomoc i cierpliwość :) Działa elegancko. Przepraszam, ale jestem naprawdę początkujący, a tempo jakie mam na studiach jest według mnie nielekkie. Jeszcze raz dziękuję i życzę miłego weekendu :)

Podobne pytania

0 głosów
1 odpowiedź 1,782 wizyt
pytanie zadane 20 kwietnia 2020 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 218 wizyt
0 głosów
1 odpowiedź 745 wizyt
pytanie zadane 24 kwietnia 2022 w C i C++ przez Mavimix Dyskutant (8,390 p.)

92,551 zapytań

141,399 odpowiedzi

319,531 komentarzy

61,938 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!

...