Передача вектора в класс без копирования - PullRequest
3 голосов
/ 11 февраля 2012

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

код заголовка someclass:

class SomeClass{
    SomeClass();
    vector<int> somePointerVector;

    public:
    SomeClass(vector<int> &someVector);
};

Я немного озадачен тем, как использовать векторы здесь. Я хотел бы установить somePointerVector = someVector, чтобы я мог манипулировать данными в someVector с другими частями класса, используя somePointerVector, и я также не хочу копировать все данные someVectors.

С массивом я бы сделал это:

int* somePointerArray = someArray;

Но как мне это сделать с векторами?

Ответы [ 3 ]

4 голосов
/ 11 февраля 2012

Сделайте somePointerVector ссылку и поместите ее в список инициализации вашего класса. (И, пожалуйста, дайте ему лучшее имя.)

class SomeClass
{
    vector<int> &somePointerVector;

  public:
    SomeClass(vector<int> &someVector)
      : somePointerVector(someVector)
    {}
};
2 голосов
/ 11 февраля 2012

Чтобы понять наиболее подходящее решение, вам нужно понять срок жизни и владение SomeClass и вектор, который он передал. Например, если SomeClass использует вектор по ссылке, то код, который создает SomeClass, должен убедиться, что время жизни вектора больше, чем у SomeClass, в противном случае SomeClass может в итоге получить ссылку, которая больше не является допустимой. Передавая по ссылке, SomeClass не «берет на себя ответственность» за вектор

В качестве альтернативы, если код, который создает SomeClass, хочет «передать» ответственность вектора (и у вас есть компилятор и реализация STL, которая «знает ссылку на r-значение»), то вы можете передать значение r ссылка на вектор;

class SomeClass { 
    vector<int> data_;

 public:
    SomeClass(vector<int>&& data) : data_(data) 
} 

Тогда код, который создает SomeClass;

vector<int> data;
data.push_back(1);
data.push_back(2);
data.push_back(3);
data.push_back(4);

SomeClass someClass(std::move(data));

В этом случае вы «переместили» вектор в SomeClass, чтобы избежать копирования, и SomeClass «взял на себя ответственность» за «данные».

0 голосов
/ 11 февраля 2012

Как насчет

class SomeClass {
    vector<int> myVector;

    void MyMethod(vector<int>* theVector);
}

и в вашем методе

void SomeClass::MyMethod(vector<int>* theVector)
{
    theVector->push_back(7);
}

Прошло много лет с тех пор, как я работал с STL, но я думаю, что это push_back?

Да, и использовать индексы вы можете просто (* theVector) [2] ...

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