2 Stimmen

vector::insert Segmentierungsfehler

Ich habe eine Klasse wie diese:

classA
{
public:
  classA()
   {
     //Here I am doing something but nothing related to vector

   }

   void updateVec(int idx, int value)
   {
     //Here, I want to update vector vector based on args passed
     myVec.insert(myVec.begin() + idx, value);

   }

  std::vector<int> myVec;
}

Jetzt erhalte ich einen Segmentierungsfehler bei der Einfügeanweisung. Muss ich den Vektor irgendwo initialisieren?

4voto

Bojan Komazec Punkte 8706

Ein Segmentierungsfehler bedeutet, dass Sie versuchen, auf Speicher zuzugreifen bzw. in Speicher zu schreiben, der (noch) nicht zugewiesen wurde. In Ihrem Fall, abhängig vom Wert von idx , myVec.begin() + idx kann auf Speicher verweisen, der sich außerhalb des zugewiesenen Bereichs von vector befindet. Bevor Sie etwas einfügen, müssen Sie sicherstellen, dass Ihr Vektor mindestens idx Elemente. updateVec sollte die aktuelle Größe des Vektors überprüfen, und wenn sie nicht groß genug ist, sollte es die vector::reserve um genügend Platz zu schaffen, damit ein neues Element eingefügt werden kann.

2voto

Kenny Cason Punkte 11692

Aus Ihrem Code geht hervor, dass Sie ihn nicht richtig initialisiert haben.

Initialisierung zur Verwendung als lokale Variable
Erstellen eines Vektors von Ints, Größe 3, initialisiert auf 0

std::vector<int> myvector (3,0);

Kurzes Beispiel für die Initialisierung (und anschließende Größenänderung) eines Vektors im Konstruktor einer Klasse

#include <iostream>
#include <vector>

class A {
public:
   A(int size);
   ~A();
   void updateVec(int idx, int value);
   void print();
private:
  std::vector<int> myVec;
};

A::A(int size) {
    myVec.resize(size);
}

A::~A() {
}

void A::updateVec(int idx, int value) {
     myVec.insert(myVec.begin() + idx, value);
}

void A::print() {
    std::vector<int>::iterator it;
    for (it=myVec.begin(); it!=myVec.end(); it++) {
        std::cout << " " << *it;
    }
}

int main() {
    A* a = new A(10);
    a->updateVec(2,10);
    a->print();
}

Hier ist die Dokumentation/Beispiel für die Verwendung eines Vektors in C++
http://www.cplusplus.com/reference/stl/vector/insert/

0voto

Gavi Lock Punkte 2327

Ja, das müssen Sie. Vektoren sind zu Beginn leer. Jeder Versuch, auf ein Element hinter dem Ende des Vektors zuzugreifen, führt zu einem Fehler.

Um eine Lösung vorschlagen zu können, müssen wir wissen, ob der Vektor seine Größe dynamisch ändern muss - oder, wenn er eine feste Größe hat, zu welchem Zeitpunkt Sie wissen, welche Größe er haben muss.

Auch, wenn Sie das 17. Element des Vektors aktualisieren, aber zu der Zeit enthält es nur 10 Elemente, wollen Sie Elemente 11 bis 16 auch erstellt werden?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X