Použití sort na vector<vector> – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Použití sort na vector<vector> – C / C++ – Fórum – Programujte.comPoužití sort na vector<vector> – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Radek
~ Anonymní uživatel
121 příspěvků
7. 7. 2007   #1
-
0
-

Ahoj, ve svém programu mám následující datovou strukturu:
typedef struct {
double delka;
std::vector<wxPoint> body;
} T_Polozka;

typedef std::vector<T_Polozka> T_Vector;

V programu mám proměnnou typu T_Vector a potřeboval bych jejich položky seřadit podle složky delka. Chtěl jsem použít algoritmus z STL knihovny sort. Už si lámu hlavu 2 dny a pořád na to nemohu přijít. Překladač na mě řve spoustu obrazovek errorů. Už jsem snad zkoušel cokoliv. Volání sortu mám snad správně: sort(promenna.begin(), promenna.end(), Porovnej)

Problem asi bude ve tvaru parametrů funkce Porovnej.

Předem děkuji za jakékoliv info.

Nahlásit jako SPAM
IP: ...–
Reklama
Reklama
Dargorar
~ Anonymní uživatel
19 příspěvků
7. 7. 2007   #2
-
0
-

To Radek:
Zkus to napsat bez te fce Porovnej tzv. ten sort jen s dvemi parametry a v datove struktuře T_Polozka nadefinuj operatori >,<,==
v tém případě to porovnávej podle delka
Napis jestli to jde

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
634 příspěvků
7. 7. 2007   #3
-
0
-

To Dargorar: Jj, máš pravdu. V STL existují dvě funkce sort, jedna a přejímá dva interátory a druhá navíc jeden parametr, kterým je porovnání, ale zde je třeba si vytvořit tzv. funktor, takže podle mého je lepší ta první varianta(v případě že si ten typ píšu sám a není např. z libky). Vector totiž neví, jak má ty položky porovnávat. Proto je potřeba si nadefinovat vlastni operator<

Nahlásit jako SPAM
IP: ...–
Radek
~ Anonymní uživatel
121 příspěvků
8. 7. 2007   #4
-
0
-

To Dargorar:
Nevím jestli jsem to udělal správně, ale zase to na mě řve mnoho obrazovek errorů.

typedef struct X {
double delka;
std::vector<wxPoint> body;
bool operator<(X a) {
return (a.delka < this->delka);
}
} T_Polozka;

Toto lze v pohodě přeložit. Ale když v programu zavolám sort(populace.begin(), populace.end()); začne to řvát.
populace je proměnná datového typu T_Vector (viz. výše). Mám to prosím dobře nebo ne?

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
634 příspěvků
8. 7. 2007   #5
-
0
-

Já tedy nejsem Dargorar, ale pokud chceš nějaké prvky uchovávat v STL kontejnerech, tak by měly mít vychozi kontruktor, kopy konstruktor a operátor přiřazení. Ovšem kompilátor je schopen vygenerovat sám tyto prvky,ale musí se dodržovat určitá pravidla.



#include <ctime>
#include <iostream>
#include <vector>
#include <cstdlib>

using namespace std;

typedef struct X {
double delka;
//std::vector<wxPoint> body;
X(double d = 0)
:delka(d)
{}
X(const X& o) // kopy konsruktor - neni potreba, stejne jako operator prirazeni - ALE pozor plati jen po teto pripad
:delka(o.delka)
{}

bool operator<(const X& a) const {
return (a.delka < this->delka);
}
} T_Polozka;

typedef std::vector<T_Polozka> VectorPolozek;

void Print(const VectorPolozek& v, const char* str)
{ assert(str && "Str je NULL");
VectorPolozek::const_iterator i = v.begin();
std::cout << str << std::endl;
for(;i!=v.end(); ++i)
std::cout << i->delka << std::endl;
}

int main(int argc, char *argv[])
{
srand(time(0));
VectorPolozek v;
for(int i = 0; i < 15; ++i)
v.push_back(X(rand()%100));
Print(v, "Pred setrizenim: ");
sort(v.begin(),v.end());
Print(v, "Po setrizeni: ");
system("PAUSE");
return EXIT_SUCCESS;
}

Nahlásit jako SPAM
IP: ...–
Dargorar
~ Anonymní uživatel
19 příspěvků
8. 7. 2007   #6
-
0
-

To Radek:
Ještě musíš nadefinovat ten operátor > a == a jak píše Jura je dobré psát konstruktor a copy-konstruktor ručně - tzv. nenachat to na kompilátoru. Taky si všimni, že Jura v těch konstrukturech předává argumenty fcí odkazem (const), což je takové nepsané pravidlo pro C++ a když už to takle budeš psát v C++ tak nepiš struct ale cclass.
Každopádně tam dopiš tu definici pro operátory > a == .
Pokud to ani teď nepůjde pokusím se sem napsat nějaké své řešení.

Nahlásit jako SPAM
IP: ...–
Radek
~ Anonymní uživatel
121 příspěvků
9. 7. 2007   #7
-
0
-

Super, stačilo jen přidat ten konstruktor a začlo to fungovat. Mám tam jen operátor < a konstruktor. Nic víc. A vypadá to, že vše pracuje správně. Ale popravdě řečeno, vůbec nechápu k čemu tam ten konstruktor je tak důležitý. Jen jsem tam zkopíroval ten z příkladu o Jury s jedním parametrem. Později jsem jen do složných závorek připsal body.clear(), ale nemá to žádný vliv. Je tedy opravdu nutné tam dopisovat ostatní operátory a ten kopírovací konstruktor? Pokud ano, může mi to někdo zdůvodnit, proč jsou ty věci tak důležité? Jsem v C++ docela začátečník (stále hodně věcí dělám C stylem) a ještě nejsem v OOP zcela doma. Mimochodem operátory <= a >= v C++ nejdou přetížit? Jinak ale všem děkuji za pomoc, ušetřili jste mi mnoho hodin.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
634 příspěvků
9. 7. 2007   #8
-
0
-

To Radek:

Nebudu se tu rozepisovat o necem, co uz je na internetu napsano a mnohem lepe, nez bych to napsal ja.http://builder.cz/serial24.html(dily 4 a 5)

A ted k tomu vectoru. Pokud chces pouzivat STL kontejnery, tak je nutne, aby obsahovaly vychozi konstruktor, kopirovaci konstruktor a operator prirazeni. Je to z toho duvodu,ze kontejnery s temi daty nejak pracuji(napr. radi, atd. Nicmene tahle rezie je pred tebou skryta) a prave v techto operaci se patre tyto metody volaji. Jina vsechny operatory, krome ::, ., :?, a pretypovani(a mozna jeste neco), lze pretizit.



class A
{
bool operator<=(const A& other) const
{ // nejaka podminka
}

bool operator>=(const A& other) const
{ // nejaka podminka
}

};

Nahlásit jako SPAM
IP: ...–
Radek
~ Anonymní uživatel
121 příspěvků
9. 7. 2007   #9
-
0
-

To Jura:
Díky za odpověď. Toho seriálu jsem si na builderu nikdy nevšiml. Na ty operátory <= a >= jsem se ptal jen proto, že mi v tom výčtu operátorů co mám přetížit chyběly. Ale to asi protože jsou nepodstatné a tato operace jde provést použitím dvou operátorů.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
634 příspěvků
9. 7. 2007   #10
-
0
-

To Radek:
Omyl, ke setřízení stačí pouze operator<. Žádné další nejsou potřeba, pokud je tedy nepotřebuješ.

Nahlásit jako SPAM
IP: ...–
Radek
~ Anonymní uživatel
121 příspěvků
9. 7. 2007   #11
-
0
-

To Jura:
Tak to vysvětluje, proč mi to s ním funguje. Trochu mě zmátl Dargorar, když psal ať dodefinuji operátory > a ==. Já ten vektor ten vektor používám jenom k ukládání a čtení hodnot + ten sort. Možná tedy nepotřebuji ani ten copy konstruktor, ale ještě si přečtu ty články na builderu. Díky za upřesnění.

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 80 hostů

Podobná vlákna

Vector vo vector — založil Juraj

Vector — založil Peter D.

2D vector — založil Huge

Vector v STL — založil yaqwsx

Kontajner vector — založil kaja

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý