2010-04-27 5 views
1

скажем, у нас есть классC++ вектор ссылочный параметр

class MyClass { 
    vector<vector<int > > myMatrice; 

public : 
    MyClass(vector<vector<int > > &); 
} 

MyClass::MyClass(vector<vector<int > > & m) { 
    myMatrice = m; 
} 

В создании экземпляра MyClass, я прохожу большой вектор < вектор < Int>> и я считаю, что объект на самом деле скопирован и не только ссылка, поэтому он занимает двойник памяти ...

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

И спасибо большое!

+0

«Матрица» является особой, «матрицами» множественного числа. Как «вершина»/«вершины». –

ответ

4

Если вы действительно хотите, чтобы ваш «MyClass» ссылался на оригинальный вектор, вам нужно также объявить его переменную-член как ссылку.

Вы также будете вынуждены использовать синтаксис инициализации, а не назначение.

+0

Если вы объявите переменную в качестве указателя, вы можете использовать назначение штрафа. Технически это уже не ссылка, а семантически. – doublep

8

Если вы хотите ссылку затем использовать ссылку:

class MyClass { 
    vector<vector<int> >& myMatrice; 
public: 
    MyClass(vector<vector<int> >& m) : myMatrice(m) {} 
}; 

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

Если вы действительно хотите совместное владение, вы должны рассмотреть использование общего указателя (например, boost::shared_ptr или std::tr1::shared_ptr) в объект, выделенный для кучи.

+0

Ну, во-первых, меня впечатляет быстрота ваших ответов (всех вас).Во-вторых, большое спасибо. И, наконец, он отлично работает, поэтому еще раз спасибо :) – Archanimus

+0

Я не знаю, должен ли я начинать новое сообщение или нет, но у меня есть довольно схожая проблема: у меня есть трехмерный вектор, и я хочу итеративно «извлечь», из него два измерения вектора (матрицы) для их обработки. Под «extract» я имею в виду только скопировать ссылку и не дублировать все данные. PS: Я бы предпочел не использовать указатели ^^ И еще раз спасибо! – Archanimus

+0

Ну, похоже, вы уже решили этот вопрос. –

1

Кроме того, что другие предлагают, вы можете избежать копирования с помощью swap:

class MyClass { 
    vector<vector<int > > myMatrice; 

public : 
    MyClass(vector<vector<int > > &); 
} 

MyClass::MyClass(vector<vector<int > > & m) { 
    myMatrice.swap(m); 
} 

Обратите внимание, что это будет искажать исходный вектор (то есть один передается вызывающей - после вызова конструктора, его будет пустым, и данные будут переданы члену myMatrice), поэтому используйте осторожно. Если вы C++ 0x положительный, вы можете использовать rvalue-reference почти так же.

2

Вы можете передать содержимое одного вектора другому, используя swap.

std::vector<int> a, b; 
fillVector(a); 

a.swap(b); 

Чаще всего (как указано выше) это используется для замены свежего (пустого) контейнера с заполненным. Это требование выполняется более гладко с помощью ссылок rvalue в C++ 1x, к которым у вас может быть доступ, в зависимости от того, какой компилятор C++ вы используете.

Независимо от того, что вы делаете, сопротивляйтесь искушению использовать неконстантную ссылку при написании конструктора копирования (или оператора присваивания). Это путь в ад, a.k.a. auto_ptr. Заманчиво в вашем случае:

MyClass(vector<vector<int> > &m) 
{ 
    myMatrix.swap(m); 
} 

Но крайне удивительно, что конструктор копирования будет изменять объект, переданный ему (! «Изменить» это вежливый способ, чтобы полностью описать потрошат его) Вместо этого, обеспечить по-разному именовать функцию-член, чтобы было ясно, что он изменит переданный ему параметр.

Смежные вопросы