Переименование вектора вместо его копирования - PullRequest
1 голос
/ 03 апреля 2012

Я бы хотел сделать следующее. но не знаю как:

    //have two vectors: vector1 (full of numbers), vector2 (empty)
    //with vectors, I mean STL vectors
    //outer loop
    {
    //inner loop 
    {
    //vector2 gets written more and more over iterations of inner loop
    //elements of vector1 are needed for this
    } //end of inner loop
    //now data of vector1 is not needed anymore and vector2 takes the role of
    //vector 1 in the next iteration of the outer loop

    //old approach (costly):
    //clear vector1 ,copy vector2's data to vector1, clear vector2

    //wanted: 
    //forget about vector1's data
    //somehow 'rename' vector2 as 'vector1' 
    //(e.g. call vector2's data 'vector1')
    //do something so vector2 is empty again
    //(e.g. when referring to vector2 in the next
    //iteration of outer loop it should be an empty vector in the
    //beginning.)

    } // end of outer loop

Я пытался

     vector<double> &vector1 = vector2;
     vector2.clear();

но я думаю, что проблема в том, что vector1 - это ссылка на vector2, который затем удаляется.

Есть идеи?

Ответы [ 4 ]

5 голосов
/ 03 апреля 2012

Можно использовать std::vector::swap:

vector<double> vector1;
vector1.swap(vector2);
4 голосов
/ 03 апреля 2012

Вам известна эта функция: http://www.cplusplus.com/reference/stl/vector/swap/

// swap vectors
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  unsigned int i;
  vector<int> first;   // empty
  vector<int> second (5,200);  // five ints with a value of 200

  first.swap(second);

  cout << "first contains:";
  for (i=0; i<first.size(); i++) cout << " " << first[i];

  cout << "\nsecond contains:";
  for (i=0; i<second.size(); i++) cout << " " << second[i];

  cout << endl;

  return 0;
}

Сложность этой функции гарантированно будет постоянной.

3 голосов
/ 03 апреля 2012

Попробуйте вместо этого поменять.

std::vector<double> vector2;

{
    std::vector<double> vector1;
    // ... fill vector1
    std::swap(vector1,vector2);  
}

// use vector2 here.
1 голос
/ 03 апреля 2012

Вы можете сделать следующее (и не использовать ссылку на другой вектор, если хотите сохранить его значения):

  • Перегрузить конструктор копирования (см. здесь ), так что элементы старого вектора будут скопированы в новый вектор (это необходимо, только если элементы вашего вектора не являются примитивными)
  • Используйте конструктор копирования

Альтернативой является использование функции подкачки.

...