Передача вектора типа для определения векторов по ссылке

Я пытаюсь передать вектор векторов по ссылке. Я напечатал тип данных, и мне кажется, что я получаю копию, а не ссылку. Я не мог найти какой-либо действительный синтаксис, чтобы делать то, что я хочу здесь. Предложения?

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cmath>

#define __DEBUG__

using namespace std;

//Define custom types and constants
typedef std::vector< std::vector<float> > points;
//Steup NAN
float NaN = 0.0/0.0;  //Should be compiler independent

//Function prototypes
void vectorFunction(float t0, float tf,  points data );

//Global constants
string outFilename = "plotData.dat";
int sampleIntervals = 10000; //Number of times to sample function.

int main()
{
ofstream plotFile;
plotFile.open(outFilename.c_str());

points data;

vectorFunction( 0, 1000, data );

#ifdef __DEBUG__
//Debug printouts
cout << data.size() << endl;
#endif

plotFile.close();
return 0;
}

void vectorFunction(float t0, float tf, points data )
{
std::vector< float > point(4);
float timeStep = (tf - t0)/float(sampleIntervals);
int counter = floor(tf*timeStep);

//Resize the points array once.

for( int i = 0; i < counter; i++)
{
point[0] = timeStep*counter;
point[1] = pow(point[0],2);
point[2] = sin(point[0]);
point[3] = -pow(point[0],2);
data.push_back(point);
}

#ifdef __DEBUG__
//Debug printouts
std::cout << "counter: " << counter
<< ", timeStep: " << timeStep
<< ", t0: " << t0
<< ", tf: " << tf << endl;
std::cout << data.size() << std::endl;
#endif

}

void tangentVectorFunction(float t0, float tf, points data)
{

}

1

Решение

Предполагая, что ваш typedef остается:

typedef std::vector< std::vector<float> > points;

Ваш прототип для передачи по ссылке будет выглядеть так:

void vectorFunction(float t0, float tf, points& data);
void tangentVectorFunction(float t0, float tf, points& data);

Ваш points тип это просто тип значения и эквивалентен std::vector< std::vector<float> >, Присвоение такой переменной делает копию. Объявление его в качестве ссылочного типа points& (или же std::vector< std::vector<float> >&) использует ссылку на оригинал.

Это, конечно, не меняет масштаб вашей проблемы, но вы можете рассмотреть возможность использования одномерного вектора. Таким образом вы экономите немного на распределении памяти, освобождении и поиске. Вы бы использовали:

point_grid[width * MAX_HEIGHT + height] // instead of point_grid[width][height]
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]