vector elemének sorszáma

 ( lzrd | 2008. augusztus 22., péntek - 18:22 )

Ü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;
    }

}

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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;
}

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 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.

"exerint nincs a vector osztálynak beépített megoldása erre."

De. Az iterátorok.

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

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

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

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

Aha!
Köszi!
--
unix -- több, mint kód. filozófia.
Life is feudal

[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.

Ööööö izé... Mit is jelent ez a mondat?
--
unix -- több, mint kód. filozófia.
Life is feudal

[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.

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.

É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