2015-03-20 2 views
0
#include <iostream> 
#include <vector> 

using namespace std; 

void printMatrix(vector<vector<int> >& m) { 
    for (int i = 0; i < m.size(); ++i) { 
     cout << "{" << m[i][0]; 
     for (int j = 1; j < m[i].size(); ++j) { 
      cout << "," << m[i][j]; 
     } 
     cout << "}\n"; 
    } 
    cout << "************************\n"; 
} 
vector<vector<int> > getClimbs(int n) { 
    vector<vector<int> > first = {{1}}; 
    if (n==1) return first; 
    vector<vector<int> > second = {{1,1}, {2}}; 
    if (n==2) return second; 
    vector<vector<int> >& one = first; 
    vector<vector<int> >& two = second; 
    vector<vector<int> > res; 
    for (int i = 3; i <= n; ++i) { 
     res.clear(); 
     for (int j = 0; j < one.size(); ++j) { 
      one[j].push_back(2); 
      res.push_back(one[j]); 
     } 
     for (int j = 0; j < two.size(); ++j) { 
      //cout << "two[0] " << two[j][0] << "\n"; 
      two[j].push_back(1); 
      //cout << "two[1] " << two[j][1] << "\n"; 
      //cout << "size : " << two[j].size() << "\n"; 
      res.push_back(two[j]); 
      //cout << "size : " << res.back().size() << "\n"; 
      //printMatrix(res); 
      two[j].pop_back(); 
     } 
     one = two; 
     two = res; 
    } 
    return res; 
} 


int main() { 
    vector<vector<int> > res = getClimbs(2); 
    printMatrix(res); 
    res = getClimbs(3); 
    printMatrix(res); 
    res = getClimbs(4); 
    printMatrix(res); 
    res = getClimbs(5); 
    printMatrix(res); 
} 

Приведенный выше код работает нормально. Но, если вы заметили, я использую два рефери в getClimbs(), один и два. Я сомневаюсь, что я делаю два = res в конце итерации, а затем res.clear() в начале следующей итерации. Теперь, поскольку два являются ссылкой на res, он должен указывать на пустой контейнер. Но этого не происходит. Я могу получить доступ ко всем элементам, которые были в res даже после сброса res. Кто-нибудь знает, почему?Вектор прозрачный эффект на ссылку в петле

Обратите внимание, что это не происходит, если не было цикла, и я просто сделал два = res, за которым следует res.clear(), а затем два указывают на пустой контейнер.

+0

Вы идете из фона Java? В C++ 'two = res' не означает то же, что и в Java. – Arkadiy

ответ

1

Вы не можете перестроить ссылочную переменную. Вместо того, что на самом деле произошло, вы вызвали конструктор копирования, чтобы скопировать вектор res в то, что ссылалось на two (в данном случае second).

Итак, вы фактически заменили вектор second копией своего res.

+0

Спасибо. Я забыл основную концепцию повторного присвоения ссылок. :) –

+0

Вы имеете в виду * не * переустанавливать их;) –

1

two является не Ссылка на res. Это ссылка на second:

vector<vector<int>>& two = second; 

литературы никогда не переназначен, поэтому линия:

two = res; 

будет вызывать оператор присваивания и скопировать содержимое res в two (псевдоним для second).

+0

спасибо. на самом деле он будет называть копия constuctor, как упоминается ниже @Rollen D'Souza. Но я ошибаюсь. :) –

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