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

Podstawa programowania obiektowego - jak znalezc najmniejszy element

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
530 wizyt
pytanie zadane 3 maja 2017 w C i C++ przez heros22pt Użytkownik (950 p.)

Jestem początkujący jeśli chodzi o programowanie obiektowe. Stworzyłem klasę cWykres dziedziczącą po cFigura. Jak wyszukać najmniejszą/ największą wartość vektora v?

#ifndef	C_WYKRES
#define C_WYKRES

#include<iostream>
#include<vector>
#include "figura.h"
using namespace std;

struct punkt2d
{
	float x, y;
};

class cWykres :cFigura
{
private:
	vector<punkt2d> v;
	float x1, y1;
	string linia;

public:
	float xMin();
	float yMin();
	float xMax();
	float yMax();

	cWykres &operator<<(punkt2d);
};


#endif

czy trzeba tworzyć obiekt globalny?

komentarz 3 maja 2017 przez mokrowski Mędrzec (158,660 p.)
Pozostaje jeszcze zadecydować w jakim przypadku dany punkt jest większy od innego punktu? Suma x i y, odległość kartezjańska do początku układu współrzędnych, inna... ?

1 odpowiedź

0 głosów
odpowiedź 3 maja 2017 przez criss Mędrzec (172,570 p.)
wybrane 3 maja 2017 przez heros22pt
 
Najlepsza

Skorzystaj z lambdy i std::min_element. Tylko nie wiem jaki jest związek między programowaniem obiektowym i twoim pytaniem :P

komentarz 3 maja 2017 przez heros22pt Użytkownik (950 p.)
taki, że nie mogę odwołać się w funkcji która ma zwracać float miny do wektora .. Nie wiem dla czego.
komentarz 3 maja 2017 przez heros22pt Użytkownik (950 p.)
bool predykat_xMin(punkt2d a, punkt2d b)
{
	if (a.x < b.x) return true;
	else return false;
}
float cWykres::xMin()
{
	punkt2d a;
	a= min_element(v.begin(), v.end(), predykat_xMin);
	return a.x;
}

To np. nie działa... podkreśla mi "="

komentarz 3 maja 2017 przez criss Mędrzec (172,570 p.)
Specjalnie dałem ci link do dokumentacji.

min_element zwraca iterator
komentarz 3 maja 2017 przez criss Mędrzec (172,570 p.)

Btw. cały ten kod można zapisać tak:

float cWykres::xMin()
{
   return std::min_element(v.begin(), v.end(), [](const punkt2d & a, const punkt2d & b) { return a.x < b.x; })->x;
}

I jeszcze (tak swoją drogą):

Niepotrzebnie rozwklekłeś kod w predykat_xMin. No i argumenty lepiej zeby przyjmował przez referencje (żeby zapobiec nieptrzebnemy kopiowaniu). Mogłoby to wyglądać tak:

bool predykat_xMin(const punkt2d & a, const punkt2d & b)
{
    return a.x < b.x;
}

Druga sprawa: skoro predykat_xMin przydaje się tylko w tym miejscu, to lepiej żeby nie był widoczny dla reszty kodu. Także jeśli jest zadeklarowany w headerze, to wyrzucić tą deklaracje a w pliku *.cpp dodać słowo static:

static bool predykat_xMin(const punkt2d & a, const punkt2d & b)
{
    return a.x < b.x;
}

albo nowsze rozwiązanie (c++11) - bezimienny namespace. Słuzy do tego samego:

namespace {
bool predykat_xMin(const punkt2d & a, const punkt2d & b)
{
    return a.x < b.x;
}
}

Dzięki temu predykat_xMin będzie widoczny tylko w tej jednostce translacji (w tym pliku).

komentarz 3 maja 2017 przez heros22pt Użytkownik (950 p.)
dzięki, ratujesz mnie.. niestety mam problem z tymi iteratorami, ale po tym co napisałeś sporo się objaśniło!

Podobne pytania

0 głosów
1 odpowiedź 223 wizyt
–1 głos
1 odpowiedź 294 wizyt
pytanie zadane 13 kwietnia 2016 w C i C++ przez falauthy Stary wyjadacz (11,550 p.)
0 głosów
2 odpowiedzi 305 wizyt
pytanie zadane 20 lutego 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)

93,440 zapytań

142,431 odpowiedzi

322,679 komentarzy

62,802 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

...