Üdvözletem!
Rákerestem a vector és vektor szavakra a C++ fórumtémák között, de nem leltem okosságot.
Az alábbi kódrészletecskével gondoltam ismerkedni a vektorokkal:
#include <vector>
using std::vector;
using std::cin;
using std::cout;
using std::endl;
// tom, h. using namespace std; rovidebb lenne.
int main()
{
vector <int> ENVEKTOROM;
ENVEKTOROM.push_back(100);
ENVEKTOROM.push_back(200);
ENVEKTOROM.push_back(300);
for (vector<int>::iterator VEKTOR_ELEM_MUTATO = ENVEKTOROM.begin(); VEKTOR_ELEM_MUTATO != ENVEKTOROM.end(); VEKTOR_ELEM_MUTATO++)
{
cout << *VEKTOR_ELEM_MUTATO << endl;
}
}
Ezzel a három egészt tartalmazó vektotom elemeit elegánsan megjelenítem a képernyőn:
100
200
300
Ez ok. De mi van, ha az elemek sorszámát is ki akarom íratni így:
1. 100
2. 200
3. 300
netán így:
0. 100
1. 200
2. 300
Csak ennyire átalakítva sikerült megoldani, de van jobb megoldás, ahol a fentit nem kell ennyire átírni? Netán egy függvény, vagy mutató ami erre jó lenne?
(Vektor osztály tagja, amivel egyszerűbben meg lehet csinálni az első példát egy picit kibővítve?
Átalakított változat:
#include <vector>
using std::vector;
using std::cin;
using std::cout;
using std::endl;
// tom, h. using namespace std; rovidebb lenne.
int main()
{
vector <int> ENVEKTOROM;
ENVEKTOROM.push_back(100);
ENVEKTOROM.push_back(200);
ENVEKTOROM.push_back(300);
for (int index=0; index < ENVEKTOROM.size(); index++)
{
cout << index + 1 << ". " << ENVEKTOROM.at(index) << endl;
}
}
- 1643 megtekintés
Hozzászólások
int i = 1;
for (vector<int>::iterator VEKTOR_ELEM_MUTATO = ENVEKTOROM.begin(); VEKTOR_ELEM_MUTATO != ENVEKTOROM.end(); VEKTOR_ELEM_MUTATO++) {
cout << i << ". elem: " << *VEKTOR_ELEM_MUTATO << endl;
i++;
}
Vagy:
vector<int>::iterator it = ENVEKTOROM.begin();
for (int i = 0; it+i != ENVEKTOROM.end(); i++) {
cout << i+1 << ". elem: " << *(it+i) << endl;
}
- A hozzászóláshoz be kell jelentkezni
Köszönöm a választ!
Ezexerint nincs a vector osztálynak beépített megoldása erre. Sejtettem, de el is szomorít. Ha már van vector.at(), akkor miért nincs visszafeléje is...
Azért titkon reméltem, hogy nem kell segéd indexet használni :(
BTW melyik az "igazi C++ programozóhoz méltó" megoldás?
Esetleg van más konténer, ami jó lenne erre?
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
A vector azert nem keresheto visszafele (elem->index irany), mert megengedi ugyanazon elem megegyszeri hozzaadasat is. Melyik lenne hat az elem indexe? Az ujabb, vagy a regebbi? Lasd meg: tyuk vs tojas.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
"exerint nincs a vector osztálynak beépített megoldása erre."
De. Az iterátorok.
- A hozzászóláshoz be kell jelentkezni
Az iterátor hogyan árulja el, hogy éppen hanyadik elemre mutat? Az iterátor akkor nem "csak" egy mutató?
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
Közben próbálgattam valamit kifaragni az iterátorokból.
#include <string>
#include <iostream>
#include <vector>
using std::endl; using std::cin; using std::cout; using std::string; using std::vector;
int main()
{
vector <int> PROBA;
int IT,KT,BT;
PROBA.push_back(100);
PROBA.push_back(200);
PROBA.push_back(300);
vector<int>::iterator szamlalo=PROBA.begin();
KT=PROBA.size();
BT=PROBA.end() - PROBA.begin();
for (szamlalo=PROBA.begin(); szamlalo != PROBA.end(); szamlalo++)
{
IT = PROBA.end() - szamlalo;
cout << BT - IT + 1 << ". " << *szamlalo << endl;
// cout << KT - IT + 1 << ". " << *szamlalo << endl; is mukodne...
}
}
Vagy segédváltozók nélkül:
for (szamlalo=PROBA.begin(); szamlalo != PROBA.end(); szamlalo++)
{
cout << (int)(PROBA.end() - PROBA.begin()) - (int)(PROBA.end() - szamlalo) + 1 << ". " << *szamlalo << endl;
}
Köszönöm a hozzászólásokat! Asszem alap szinten sikerült megismerkednem a vektorral :D
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
Beírom inkább a teljes kódot:
#include <string>
#include <iostream>
#include <vector>
using std::endl; using std::cin; using std::cout; using std::string; using std::vector;
int main()
{
vector <int> PROBA;
PROBA.push_back(100);
PROBA.push_back(200);
PROBA.push_back(300);
vector<int>::iterator szamlalo=PROBA.begin();
for (szamlalo=PROBA.begin(); szamlalo != PROBA.end(); szamlalo++)
{
cout << (int)(PROBA.end() - PROBA.begin()) - (int)(PROBA.end() - szamlalo) + 1 << ". " << *szamlalo << endl;
}
}
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
Mi is a baj ezzel?
cout << (szamlalo - PROBA.begin()) + 1 << ". " << *szamlalo << endl;
Hint: http://www.sgi.com/tech/stl/RandomAccessIterator.html
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Aha!
Köszi!
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
[off]
amikor a fagylalt visszanyal :)
[/off]
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.
- A hozzászóláshoz be kell jelentkezni
Ööööö izé... Mit is jelent ez a mondat?
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
[szarkazmus]eljenek az iteratorok![/szarkazmus]
talan meg az iteratorok kulonbsege lenne a leglogikusabb kivonni az i-dik iteratorbol a begin()-t, de reg volt nekem a c++ nem tudom van e definialva rajuk a kivonas - es ha van az mit ad.. de meg ha mukodik is nem vagyok biztos benne, hogy nem tombre hanem mondjuk egy binaris fara a linearis bejaras nem lesz mondjuk negyzetes...
Ket valtozot hasznalva egyet a sorszamnak egyet az iteratornak meg logikatlanabb...
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.
- A hozzászóláshoz be kell jelentkezni
Viszont a kétváltozós megoldás működik bármely, iterátort támogató tárolóval, legyen az akár láncolt lista is. Ebben nyilvánvaló módon nem működik az indexelés.
- A hozzászóláshoz be kell jelentkezni
Éljenek bizony...
Nélkülük elég nehéz lenne tárolófüggetlen algoritmusokat írni...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni