вектор :: ошибка сегментации вставки - PullRequest
2 голосов
/ 17 февраля 2011

У меня есть такой класс:

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

Теперь я получаю ошибку сегментации в операторе вставки.Нужно ли где-нибудь инициализировать вектор?

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

Ошибка сегментации означает, что вы пытаетесь получить доступ / записать в память, которая еще не была выделена. В вашем случае, в зависимости от значения idx, myVec.begin() + idx может относиться к памяти, которая находится вне выделенной векторной зоны. Перед вставкой необходимо убедиться, что ваш вектор может содержать не менее idx элементов. updateVec должен проверить текущий размер вектора, а если он недостаточно велик, он должен вызвать vector::reserve, чтобы выделить достаточно места, чтобы можно было вставить новый элемент.

2 голосов
/ 17 февраля 2011

Судя по вашему коду, вы не правильно его инициализировали.

инициализация для использования в качестве локальной переменной
Создайте вектор целых, размер 3, инициализированный до 0

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

Краткий пример того, как инициализировать (а затем изменить размер) вектор в конструкторе класса

#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();
}

Вот документация / пример использования вектора в C ++.
http://www.cplusplus.com/reference/stl/vector/insert/

0 голосов
/ 17 февраля 2011

Да, вы делаете.Векторы начинаются пустыми.Любая попытка получить доступ к элементу после конца вектора приведет к ошибке.

Чтобы предложить решение, нам нужно будет знать, нужно ли вектору динамически изменять размер - или это фиксированный размер, в какой момент времени вы будете знать, какого размера он должен быть.

Кроме того, если вы обновляете 17-й элемент вектора, но в то время, когда он содержит только 10 элементов, хотите, чтобы элементы 11 были16 также будет создан?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...