Ładny brzuch

Witam !

Pki co uywam std::vector<std::vector<CContact > > ale wydaje mi si e moe jest co lepszego. Ma to "wyglda" mniej wicej tak

Grupa pierwsza | grupa druga| grupa trzecia --------------------------------------------         kontat1  | kontakt3       | kontakt 7          kontakt2  | kontakt4       | kontakt 8                   |kontakt 5       | kontakt 9                   | kontakt 6

oczywicie to rozmiar grupy i ilo grup jest zmienna(czyli kontener dynamiczny) - jak to przedstawi inaczej ni std::vector<std::vector<CContact> > ?



Moe std::map?

Zwyka mapa kademu kluczowi (np. nazwa lub identyfikator grupy) przyporzdkowuje jedn warto, a autor chce mie wiele grup z wieloma kontaktami. Musiaby stworzy map wektorw. Zamiast tego mona skorzysta z "multimap". Krtki przykad:

#include <iostream> #include <string> #include <map> class CContact { public: std::string name; CContact(const std::string& name) : name(name) { } }; int main() { std::multimap<std::string, CContact> contacts; contacts.insert(std::make_pair("Main Group", CContact("aaa"))); contacts.insert(std::make_pair("Main Group", CContact("bbb"))); contacts.insert(std::make_pair("Main Group", CContact("ccc"))); contacts.insert(std::make_pair("Another Group", CContact("111"))); contacts.insert(std::make_pair("Another Group", CContact("222"))); std::cout << contacts.count("Main Group") << std::endl; if (contacts.find("Another Group") != contacts.end()) { std::cout << contacts.count("Another Group") << std::endl; } if (contacts.find("Group") != contacts.end()) { std::cout << contacts.count("Group") << std::endl; } for each (std::pair<std::string, CContact> p in contacts) { std::cout << p.first << " - " << p.second.name << std::endl; } return 0; }

PS W takim razie, mae sprostowanie. Taka konstrukcja "for each" dziaa tylko w kompilatorze MS ;)
Uytkownik Kozack edytowa ten post 24 sierpie 2008, 10:17
Moesz si mczy si z wektorem parametryzowanym kolejnym wektorem i to bdzie dziaa. Ale nie jest to ani specjalnie adne, ani wygodne. Mam natomiast inn propozycj. Wszystko sobie adnie rozpisz i jak przysidziesz raz nad metodami to wszystko potem bdzie prostsze :) Ale jak ju projektowa obiektowo to na caego (w granicach rozsdku oczywicie). Zarys wyglda nastpujco i raczej nie ma w nim nic odkrywczego:class Contact { private: std::string m_name; // inne metody ... }; class Group { private: std::string m_name; std::vector<Contact*> m_contacts; public: typedef std::vector<Contact*>::iterator ContactIter; // inne metody do obsugi }; class AddressBook //z t nazw strzelam :) { private: std::vector<Group*> m_groups; public: typedef std::vector<Group*>::iterator GroupIter; // inne metody };

A do postu wyej. ycie byoby za pikne gdyby C++ miao tak budow for each :)
void PrintContact(std::pair<const std::string, CContact>& p) { std::cout << p.first << " - " << p.second.name << std::endl; } //... for_each(contacts.begin(), contacts.end(), PrintContact);
Uytkownik reVis edytowa ten post 24 sierpie 2008, 05:13



...

nie powiem e pomys na takie opakowanie klas jest cakiem ciekawy :) musz si teraz nad nim zastanowi ;)

co do for each - zobacz sobie boost::foreach i boost::lambda/boost::function, dam gow e da rad tak zrobi ;)


co do for each - zobacz sobie boost::foreach i boost::lambda/boost::function, dam gow e da rad tak zrobi ;)
Wiem, e si da. Kwestia, e trzymalimy si biblioteki standardowej ;)
Uytkownik reVis edytowa ten post 24 sierpie 2008, 15:26

co do for each - zobacz sobie boost::foreach i boost::lambda/boost::function, dam gow e da rad tak zrobi ;)
"for each" z mojego przykadu dziaa na poziomie konstrukcji np. "if" oraz "switch" i jednie w kompilatorze MS. "FOR_EACH" z boosta, to makro czy funkcja, wic to dwie rne rzeczy ;)
Uytkownik Kozack edytowa ten post 24 sierpie 2008, 19:00
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •