2d Vector Of Classes, How To Reference

Stel dat ik:

class Intersection {
 public:
 int street;
 int avenue;
 double x;
 double y;
 double green[2];   //Light green times for STREET & AVENUE
 list  adj;
 double best_time;
 class Road_Segment *backedge;
 multimap ::iterator bfsq_ptr;
 };

En in mijn hoofdfunctie heb ik een 2d-vector van:

vector > vvin ; 
vector >::iterator vvit ; 

En ik benader het als zodanig:

for (lit = City_Map::all.begin() ; lit != City_Map::all.end() ; lit++ ) {

inter = *lit ;
s = inter->street ;
a = inter->avenue ;
vvin[s][a] = inter ; 
}

Waar aangestoken is een lijst iterator die alle klassen bevat. Ik heb moeilijkheid om toegang te krijgen tot de 2d vector via integer index, iets waarvan ik weet dat ik het in het verleden heb gedaan. Het programma is segfaulting op die exacte lijn. Om het even welke ideeën waarom?

Ook, zelfs

cout << vvin[i][j] << endl ;//or for that matter[0][0] or [1][1] or whatever

segfaults, dus ik weet dat het niet de aanwijzeropdracht is.

Als ik geen toegang tot het via integer index kan krijgen, is er een manier om iterators op dezelfde manier te gebruiken, zodat ik er toegang toe heb als een 2d array?

Alsjeblieft en bedankt.

0
Uw vectoren zijn waarschijnlijk leeg en dus hebt u toegang tot gegevens over grenzen.
toegevoegd de auteur Pubby, de bron
Heb je de afmetingen van beide dimensies aangepast?
toegevoegd de auteur Pubby, de bron
nah, deed de vvin.resize (100) en nog steeds segfaulted. Moet .push_back (inter) gebruiken. Niet wat ik wilde.
toegevoegd de auteur FatAdama, de bron

2 antwoord

Je hebt waarschijnlijk toegang tot buiten de grenzen. Proberen...

std::cout << "vvin.size() = " << vvin.size() << '\n';
for( size_t i = 0; i < vvin.size(); ++i )
{
    std::cout << "vvin[" << i << "].size() = " << vvin[i].size() << '\n';
}

Of stel een aantal breekpunten in en inspecteer de vectoren op die manier.

1
toegevoegd

Allereerst lijkt een heleboel aanwijzingen echt gevaarlijk. Het is erg moeilijk om geheugendeallocatie op te sporen voor al deze aanwijzingen.

So at first try to use vector >; to remove the possibility of an invalid pointer to the Intersection structure.

Als de bug niet is opgelost, probeer dan deze eenvoudige test om er zeker van te zijn dat je een element hebt om te adresseren met 2 indexen:

vector > vvin;
vvin.push_back(vector());
vvin.back().push_back(Intersection());
cout << vvin[0][0] << endl;

Als deze code normaal werkt (hij moet normaal werken!), Is het duidelijk dat je geen element creëert dat je probeert aan te pakken door 2 indices.

0
toegevoegd