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.
Fórum › C / C++
Použití sort na vector<vector>
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<
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?
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;
}
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í.
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.
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
}
};
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ů.
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í.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Vector vo vector — založil Juraj
Vector a erase — založil yaqwsx
Pointer na vector — založil drizz
Moderátoři diskuze