Pagini: 1 [2]   În jos
  Imprimă  
Ajutor Subiect: Standard Template Library (STL)  (Citit de 32183 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
BitOne
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 45



Vezi Profilul
« Răspunde #25 : Iunie 01, 2010, 16:37:26 »

@BitOne
Pentru hashing nu se comporta bine daca folosesti containerul map. Se pot folosi bibliotecile hash_set.h sau hash_map.h .
Pentru a le folosi trebuie inclus namespaceul __gnu_cxx
Multumesc, dar eu chiar la hash_set/hash_map/unordered_set/unordered_map ma refeream Smile
App: pentru versiunile de g++ >= 4.3 trebuie hash_set sau hash_map
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #26 : Iunie 01, 2010, 18:13:55 »

Grija mare la hash set, pentru ca nu sunt in standard, iar atunci cand vor fi introduse se vor numi unordered set.
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
devilkind
Echipa infoarena
Nu mai tace
*****

Karma: 284
Deconectat Deconectat

Mesaje: 1.240



Vezi Profilul
« Răspunde #27 : Iunie 02, 2010, 00:58:36 »

Eu recomand folosirea STL-ului oricand acesta face implementarea mai usoara. E mai ok sa pierzi 10 puncte la olimpiada pentru ca nu ti-a intrat in timp hash_map-ul decat sa pierzi 100 de puncte din cauza unui bug pe care nu l-ai observat din cauza ca aveai nu stiu cate sute de linii de cod.

Totodata stl-ul e util in real-life development.
Memorat
miculprogramator
Nu mai tace
*****

Karma: 65
Deconectat Deconectat

Mesaje: 306



Vezi Profilul
« Răspunde #28 : Iunie 02, 2010, 17:35:20 »

Totusi, programele care folosesc STL au un dezavantaj cand vine vorba de debug. Eu folosesc MinGW Developer Studio si cand vreau sa fac debug nu pot sa vad nimic din ce ma intereseaza. Se poate rezolva cumva ?

Si mai am o intrebare : de ce atunci cand folosesc clasa string nu pot sa afisez un sir de caractere cu printf ("%s", sir) si trebuie sa folosesc neaparat cout ?

Cod:
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;

int main ()
{
string sir = "Working with STL";

//printf ("%s ", sir);  /* nu functioneaza */
cout << sir;   /* functioneaza */

return 0;
}
Memorat
Mishu91
Nu mai tace
*****

Karma: 169
Deconectat Deconectat

Mesaje: 751



Vezi Profilul
« Răspunde #29 : Iunie 02, 2010, 17:38:18 »

Se poate si cu printf, dar trebuie să faci ceva de genul printf("%s", sir.c_str()). Metoda c_str() convertește un string într-un char*.
Memorat
BitOne
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 45



Vezi Profilul
« Răspunde #30 : Iunie 02, 2010, 18:00:17 »

Totusi, programele care folosesc STL au un dezavantaj cand vine vorba de debug. Eu folosesc MinGW Developer Studio si cand vreau sa fac debug nu pot sa vad nimic din ce ma intereseaza. Se poate rezolva cumva ?
Din cate stiu nu ( ma rog, doar daca dai v[ i ] sau v[50] ...etc ), dar poti face un debug in visual studio sau code::blocks sau sa-ti creezi un fisier debug.txt si sa afisezi  ce te intereseaza Smile
Memorat
Mishu91
Nu mai tace
*****

Karma: 169
Deconectat Deconectat

Mesaje: 751



Vezi Profilul
« Răspunde #31 : Iunie 03, 2010, 07:59:19 »

Totusi, programele care folosesc STL au un dezavantaj cand vine vorba de debug. Eu folosesc MinGW Developer Studio si cand vreau sa fac debug nu pot sa vad nimic din ce ma intereseaza. Se poate rezolva cumva ?
Din cate stiu nu ( ma rog, doar daca dai v[ i ] sau v[50] ...etc ), dar poti face un debug in visual studio sau code::blocks sau sa-ti creezi un fisier debug.txt si sa afisezi  ce te intereseaza Smile
Nu cred că debug.txt e soluția, pentru că dacă intră în ciclu infinit sau ia Segmentation Fault nu va apărea nimic în debug.txt (poți să îi dai câte un fflush după fiecare afișare, dar este incomod). Cel mai bine faci fprintf(stderr, "...")
Memorat
BitOne
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 45



Vezi Profilul
« Răspunde #32 : Iunie 03, 2010, 11:18:50 »

Nu cred că debug.txt e soluția, pentru că dacă intră în ciclu infinit sau ia Segmentation Fault nu va apărea nimic în debug.txt (poți să îi dai câte un fflush după fiecare afișare, dar este incomod). Cel mai bine faci fprintf(stderr, "...")
stderr  este setat implicit ca si stdout ( console output ) deci tot acolo ajungem pana la urma Smile
Memorat
devilkind
Echipa infoarena
Nu mai tace
*****

Karma: 284
Deconectat Deconectat

Mesaje: 1.240



Vezi Profilul
« Răspunde #33 : Iunie 03, 2010, 11:39:16 »

Nu chiar. La stderr se face flush automat, la stdout nu. Eu de obicei faceam asa
Citat
freopen(stderr, "log.txt");
fprintf(stderr, "...");
Memorat
S7012MY
Nu mai tace
*****

Karma: 26
Deconectat Deconectat

Mesaje: 648



Vezi Profilul
« Răspunde #34 : Martie 04, 2011, 14:03:10 »

Vreau sa adaug si eu 2 lucruri care cred ca sunt importante.  wink
bitset-ul nu da kbs-uri sau erori daca este acesat un element din afara lui.
Vectorii au operatori '<', '>', etc care ii compara lexicografic Very Happy . http://www.cppreference.com/wiki/container/vector/operator_comp
Memorat
soriyn
Vorbaret
****

Karma: 24
Deconectat Deconectat

Mesaje: 150



Vezi Profilul
« Răspunde #35 : Ianuarie 10, 2012, 17:28:05 »

se poate sa am ceva de genu ?

Cod:
vector <int, <int,int> > x[10] ;

si daca da cum ii acesez elementele si cum folosesc, de exemplu, push_back() ?
Memorat
MciprianM
Nu mai tace
*****

Karma: 87
Deconectat Deconectat

Mesaje: 324



Vezi Profilul
« Răspunde #36 : Ianuarie 10, 2012, 19:34:08 »

Eu cred ca tu vrei sa ai un vector cu trei valori intregi. Poti face asa:
Cod:
struct type1 {
  int a,b,c;
};
vector<type1> v;
type1 x;
x.a=2;
x.b=8;
x.c=1;
v.push_back(x);
cout << v [0].a << v [0].b << v [0].c << endl;
for (vector<type1> :: iterator it = v.begin (); it != v.end (); ++ it) {
  cout << it->a << it->b << it->c << endl;
}

Sau daca vrei sa le grupezi, dupa cum am dedus din scrierea ta:
Cod:
struct type2 {
  int a, b;
};
struct type3 {
  int a;
  type2 y;
};
vector<type3> v;
type3 x;
x.a=2;
x.y.a=8;
x.y.b=1;
v.push_back(x);
cout << v [0].a << v [0].y.b << v [0].y.c << endl;
for (vector<type3> :: iterator it = v.begin (); it != v.end (); ++ it) {
  cout << it->a << (it->y).b << (it->y).c << endl;
}

Sau cu structura pair din stl:
Cod:
vector<pair<int, pair<int, int> > > v;
pair <int, pair <int, int> > x;
x.first = 2;
x.second.first=3;
x.second.second=4;
v.push_back (x);
v.push_back(make_pair(5, make_pair(6, 7)));
cout << v [0].first << v [0].second.first << v [0].second.second << endl;
for (vector<pair<int, pair <int, int> > > :: iterator it = v.begin (); it != v.end (); ++ it) {
  cout << it->first << (it->second).first << (it->second).second << endl;
}
Sau poti sa-ti faci ceva similar structurii pair din stl:
Cod:
template<class C1, class C2> struct pereche {
  C1 first;
  C2 second;
}
vector<pereche<int, pereche<int, int> > > v;
pereche <int, pereche <int, int> > x;
x.first = 2;
x.second.first=3;
x.second.second=4;
v.push_back (x);
cout << v [0].first << v [0].second.first << v [0].second.second << endl;
for (vector<pereche<int, pereche <int, int> > > :: iterator it = v.begin (); it != v.end (); ++ it) {
  cout << it->first << (it->second).first << (it->second).second << endl;
}

Daca ti se par prea lungi tipurile poti sa pui oricand un typedef:
Cod:
typedef vector <pair <int, pair <int, int> > > :: iterator vit;
for (vit it = v.begin (); it != v.end (); ++ it) {
  cout << it->first << (it->second).first << (it->second).second << endl;
}
Sau pe rand:
Cod:
typedef pair <int, int> pii;
typedef pair<int, pii> pip;
typedef vector <pip> vp;
typedef vp::iterator vit;
vp v;
pip x;
x.first = 2;
x.second.first=3;
x.second.second=4;
v.push_back (x);
v.push_back(make_pair(5, make_pair(6, 7)));
cout << v [0].first << v [0].second.first << v [0].second.second << endl;
for (vit it = v.begin (); it != v.end (); ++ it) {
  cout << it->first << (it->second).first << (it->second).second << endl;
}

Memorat
soriyn
Vorbaret
****

Karma: 24
Deconectat Deconectat

Mesaje: 150



Vezi Profilul
« Răspunde #37 : Ianuarie 10, 2012, 20:19:34 »

Exact un vector cu trei valori vreau. Problema e ca incercasem chestia cu structura si tot primeam Segmentation fault. Apoi am rescris sursa si n-am mai avut probleme. Si voiam sa stiu daca pot scapa de acel struct. Si da, asta voiam

Cod:
vector<pair<int, pair<int, int> > > v;

Multumesc, m-ai luminat din nou  Very Happy
Memorat
dutzul
De-al casei
***

Karma: 42
Deconectat Deconectat

Mesaje: 119



Vezi Profilul
« Răspunde #38 : Mai 21, 2012, 21:49:40 »

hmm daca ma poate ajuta cnv am o intrebare legat de <set>(multiset)
cum se face cu funnctia de comparare intre struct-uri
eu am de exemplu
Cod:
using namespace std;
bool comp (two a,two b)
{
    return (a.x<b.x);
}
multiset <two,comp> my_set;

int main()
{

   f>>n;
   for(i=1;i<=n;++i)
   {
       f>>t.x;
       t.y=i;
       my_set.insert(t);
   }

   f.close();
   g.close();
    return 0;
}
am incercat so fac ca si la functia sort din stl si ,nu merge si mai am intrebare cum se face accessul la un element anume;
mersi anticipat
Memorat
freak93
Echipa infoarena
Nu mai tace
*****

Karma: 341
Deconectat Deconectat

Mesaje: 804



Vezi Profilul
« Răspunde #39 : Mai 21, 2012, 22:41:37 »

multiset<two> my_set(comp);
comp trebuie sa fie functor( cauta pe forum si ai sa gasesti).
 ca sa accesezi un element(daca exista) *my_set.find(ceva); unde ceva e de tipul two in cazul de fata. sper sa nu zic prostii ca e cam tarziu
Memorat
dutzul
De-al casei
***

Karma: 42
Deconectat Deconectat

Mesaje: 119



Vezi Profilul
« Răspunde #40 : Mai 22, 2012, 00:52:40 »

mersi am gasit Very Happy
Memorat
rgrig
De-al casei
***

Karma: 46
Deconectat Deconectat

Mesaje: 144



Vezi Profilul WWW
« Răspunde #41 : Iunie 27, 2012, 19:18:33 »

Exact un vector cu trei valori vreau.

Mai nou exista tuple. De exemplu

Cod:
#include <cstdio>
#include <vector>
#include <tuple>
using namespace std;
int main() {
  vector<tuple<int, int, char> > v;
  v.push_back(make_tuple(1,2,'a'));
  printf("%d %d %c\n", get<0>(v[0]), get<1>(v[0]), get<2>(v[0]));
}

se compileaza cu "g++ -std=c++0x a.cpp", cel putin cu versiunea >=4.4.3.
Memorat
dutzul
De-al casei
***

Karma: 42
Deconectat Deconectat

Mesaje: 119



Vezi Profilul
« Răspunde #42 : August 07, 2012, 01:46:48 »

am o intrebare legata de functia de comparare pentru set
Cod:
struct compareTwo
{
   bool cmp(const int &a,const int &b)
    { return a<b;}
}
am observat ca merge si daca scrii doar bool cmp(int a,int b) nu trebuie const si & .
e posibil sa apara erori daca nu pun const? sau &??

[editat de moderator]: foloseste tag-ul "code".
« Ultima modificare: August 07, 2012, 10:06:14 de către Dragos-Alin Rotaru » Memorat
darkseeker
De-al casei
***

Karma: 29
Deconectat Deconectat

Mesaje: 106



Vezi Profilul
« Răspunde #43 : August 07, 2012, 10:57:13 »

Nu va genera nicio eroare definirea functiei ca bool cmp(int a,int b) . Totusi, cred ca merge putin mai incet programul decat acela in care functia e definita bool cmp(const int &a ,const int &b) , insa nu stiu sa-ti explic de ce.
Memorat
ionut98
Strain
*

Karma: 2
Deconectat Deconectat

Mesaje: 44



Vezi Profilul
« Răspunde #44 : Decembrie 30, 2014, 19:12:29 »

salut imi poate explica cineva putin cum functioneaza iteratorii  Smile

daca se poate un exemplu cu iteratori si unul fara iteratori la acelasi lucru (la orice)
Memorat
gapdan
Strain
*

Karma: -17
Deconectat Deconectat

Mesaje: 27



Vezi Profilul
« Răspunde #45 : Ianuarie 25, 2015, 19:19:24 »

Uite asa parcurgi un vector din STL cu iteratori
 
Cod:
for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
    std::cout << ' ' << *it;

Adica in loc sa accesezi direct cu v ai un iterator cu care te plimbi prin memorie.
Din cate am observat sunt ceva mai lenti iteratorii.
 
Mai multe gasesti aici:
http://www.cplusplus.com/reference/vector/vector/begin/


Acum stie cineva daca la ONI/OJI evaluatoarele suporta biblioteca
Cod:
<unordered_map>
?
Memorat
Pagini: 1 [2]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines