Hledání v listu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hledání v listu – C / C++ – Fórum – Programujte.comHledání v listu – C / C++ – Fórum – Programujte.com

 

yaqwsx+9
Posthunter
24. 9. 2009   #1
-
0
-

Dejme tomu, že mám strukturu:

struct struktura

{
unsigned int cislo;
data nejaka_data;
}

A mám list těchto struktur. Jak vyhledávat (respektive pomocí kterého algoritmu STL) strukturu podle atributu číslo? Vlatní řešení pomocí sekvenčního přístupu, by nebylo složité, ale rád bych věděl, jestli na toto STL něco definuje.

Děkuji za odpověď

Nahlásit jako SPAM
IP: 85.160.107.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
ondra.holub+1
Stálý člen
25. 9. 2009   #2
-
0
-

#include <iostream>


#include <list>
#include <algorithm>

// tady si nastav jednu z variant 1 az 4
#define VARIANTA 1

#if VARIANTA==3 || VARIANTA==4
#include <boost/lambda/lambda.hpp>
#include <boost/bind.hpp>
#endif

struct struktura
{
struktura(unsigned cislo, int data)
: cislo(cislo),
data(data)
{
}

#if VARIANTA==1
operator unsigned() const
{
return cislo;
}
#endif

#if VARIANTA==2
bool PorovnejCislo(
const struktura& s
) const
{
return cislo == s.cislo;
}
#endif

#if VARIANTA==4
unsigned GetCislo() const { return cislo; }
#endif

unsigned int cislo;
int data;
};

typedef
std::list<struktura> L;

int main()
{
L l;
l.push_back(struktura(4, 1));
l.push_back(struktura(5, 2));
l.push_back(struktura(1, 3));
l.push_back(struktura(12, 4));
l.push_back(struktura(100, 5));
l.push_back(struktura(3, 6));

#if VARIANTA==1
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
std::bind2nd(std::equal_to<unsigned>(), 12U) // Vyuziti moznosti pretypovani struktury na unsigned
);
#elif VARIANTA==2
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
std::bind2nd(std::mem_fun_ref(&struktura::PorovnejCislo), 12U)
);
#elif VARIANTA==3
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
boost::bind(&struktura::cislo, _1) == 12U
);
#elif VARIANTA==4
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
boost::bind(&struktura::GetCislo, _1) == 12U
);
#endif

if (it == l.end())
std::cout << "Nenalezeno\n";
else
std::cout << "Nalezeno " << it->cislo << ", " << it->data << '\n';
}

Nahlásit jako SPAM
IP: 194.138.12.–
ondra.holub
~ Anonymní uživatel
255 příspěvků
25. 9. 2009   #3
-
0
-

Zázrak - příspěvek se vložil. Tak tedy popis jako anonym (podotýkám, že jsem pořád přihlášený):

Takže jsou tam 4 varianty. Vybírá se mezi nimi přes define na řádku 7.

První varianta je zhovadilost, kterou nedoporučuji kvůli tomu přetypování. Možná pro nějaké malé triviální třídy by to bylo použitelné.

Druhá varianta je v pohodě z pohledu STL. Nepočítal bych ale moc s tím, že to pojede i ve Visual C++. Možná v nějaké nové verzi nebo s STL portem. To nemám vyzkoušené.

3. a 4. varianta jsou mými favority. Využívají boost. Jsou jasně čitelné (i když vypadají tak trošku magicky) a je hned jasné, co tím programátor myslel.

Nahlásit jako SPAM
IP: 194.138.12.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
25. 9. 2009   #4
-
0
-

Oprava metody PorovnejCislo.

#include <iostream>


#include <list>
#include <algorithm>

// tady si nastav jednu z variant 1 az 4
#define VARIANTA 2

#if VARIANTA==3 || VARIANTA==4
#include <boost/lambda/lambda.hpp>
#include <boost/bind.hpp>
#endif

struct struktura
{
struktura(unsigned cislo, int data)
: cislo(cislo),
data(data)
{
}

#if VARIANTA==1
operator unsigned() const
{
return cislo;
}
#endif

#if VARIANTA==2
bool PorovnejCislo(
unsigned c
) const
{
return cislo == c;
}
#endif

#if VARIANTA==4
unsigned GetCislo() const { return cislo; }
#endif

unsigned int cislo;
int data;
};

typedef
std::list<struktura> L;

int main()
{
L l;
l.push_back(struktura(4, 1));
l.push_back(struktura(5, 2));
l.push_back(struktura(1, 3));
l.push_back(struktura(12, 4));
l.push_back(struktura(100, 5));
l.push_back(struktura(3, 6));

#if VARIANTA==1
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
std::bind2nd(std::equal_to<unsigned>(), 12U) // Vyuziti moznosti pretypovani struktury na unsigned
);
#elif VARIANTA==2
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
std::bind2nd(std::mem_fun_ref(&struktura::PorovnejCislo), 12U)
);
#elif VARIANTA==3
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
boost::bind(&struktura::cislo, _1) == 12U
);
#elif VARIANTA==4
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
boost::bind(&struktura::GetCislo, _1) == 12U
);
#endif

if (it == l.end())
std::cout << "Nenalezeno\n";
else
std::cout << "Nalezeno " << it->cislo << ", " << it->data << '\n';
}

Nahlásit jako SPAM
IP: 194.138.12.–
yaqwsx+9
Posthunter
25. 9. 2009   #5
-
0
-

Díky za odpověď. Zpočátku v tom byl trochu chaos, ale už tomu rozumím.

Nahlásit jako SPAM
IP: 85.160.78.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
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, 85 hostů

Podobná vlákna

Editace listu listů — založil Matěj Andrle

Vycentrovanie listu — založil Peter

Nacitani Listu z XML — založil gabbo

Moderátoři diskuze

 

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