вектор адреса метода c ++

0

Я новичок в использовании вектора, мне нужен метод, который возвращает addres вектора, это код semplifide:

класс:

#include<vector>

class A
{
private:
    std::vector<int> v;
public:
    A()
    {
        for (int i = 0; i < 5; i++)
            v[i] = i;
    }

    std::vector<int> give()
    {
          return v;
    }

    ~A() {}
};

главный:

#include <iostream>
#include "class.cpp"

int main(int argc, char **argv)
{
    A a;

    int *vptr = NULL;

    vptr = &a.give()[0];

    std::vector<int> b;

    return 0;
}

этот код компилируется, но во время выполнения предоставляется ошибка сегментации

  • 2
    Зачем вам нужно возвращать адрес?
  • 0
    Почему вы #, включая .cpp файл?
Показать ещё 7 комментариев
Теги:
vector

2 ответа

0
Лучший ответ

Этот конструктор

A(){
    for(int i = 0; i < 5; i++)
        v[i] = i;
}

недействителен, поскольку вектор не имеет еще элементов, которые вы могли бы использовать оператор индекса. Правильнее было бы написать

A() : v( 5 ) {
    for(int i = 0; i < 5; i++)
        v[i] = i;
}

Что касается вашего вопроса, тогда std :: vector имеет данные функции-члена, которые возвращают адрес своего внутреннего буфера с элементами.

Так что вы могли бы написать

int * give(){ return v.data(); }

или

const int * give() const { return v.data(); }

В основном вы могли бы написать

int *vptr = a.give();
  • 0
    Еще лучше для конструктора, std::iota .
  • 0
    @ Крис Я уверен, что он еще не знает о стандартных алгоритмах.
Показать ещё 1 комментарий
-1

У вас здесь несколько больших проблем.

Во-первых, в конструкторе вы пытаетесь получить доступ к элементам вектора, которые еще не существуют:

A(){
    for(int i = 0; i < 5; i++)
        v[i] = i;
}

vector не совпадает с map где, если элемент, который вы ищете с помощью operator[], не существует, создается новый. В vector если вы используете operator[] с индексом, который не существует, вы получаете Undefined Behavior и вероятный сбой. Здесь вы должны вставлять элементы. На пути push_back:

A(){
  for (int i = 0; i < 5; ++i)
    v.push_back (i);
}

Далее, give() возвращает vector значение:

std::vector<int> give(){
    return v;
}

Которая делает копию v и возвращает эту копию. Хорошо, что технически хорошо, но когда вы вызываете give() вы не присваиваете возвращаемое значение переменной. В конечном итоге копия вектора становится временным объектом. Как только делается так называемое "полное выражение", в котором было создано временное, временное уничтожение.

Это полное выражение:

vptr = &a.give()[0];

Таким образом, vptr был назначен адрес первого элемента этого временного vector, но как только достигнут конец этого выражения, этот вектор уничтожается, а vptr теперь указывает на гиперпространство. Если вы попытаетесь разыменовать этот дикий указатель, вы получите Undefined Behavior и очень вероятную ошибку сегментации.

Чтобы исправить это, вы можете позволить A рассказать вам адрес первого элемента vector:

class A
{
// [...]
public:  
  void*  give() { return v.data(); }
};
  • 0
    А если я хочу вернуть копию вектора v? Что я должен сделать?
  • 0
    И последний вопрос: какой разумный способ подтолкнуть некоторые элементы в начале вектора? Нет метода push_front?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню