Редактировать код структуры данных, чтобы использовать два вектора

#c #vector

#c #вектор

Вопрос:

У меня есть этот алгоритм, который я хочу отредактировать, чтобы он принимал два вектора. Два вектора создаются из данных в файле csv, и я хочу сравнить данные в двух векторах. Приведенный ниже алгоритм принимает только один вектор, содержащий оба значения, которые необходимо сравнить, но я хочу изменить его так, чтобы он мог принимать два отдельных вектора и сравнивать значения между двумя векторами.

 #include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <string>
using namespace std;

// Some data
istringstream str( "1  3n"
                   "2  5n"
                   "3  7n"
                   "4  9n"
                   "5 11n" );


//======================================================================


struct Data{ double x, y; };


//======================================================================


vector<Data> getData( istream amp;in )
{
   vector<Data> resu<
   for ( double x, y; in >> x >> y; ) result.push_back( { x, y } );
   return resu<
}
 

Комментарии:

1. вы объяснили, что вы хотите сделать, но что мешает вам это сделать?

2. вы должны исправить это cout fmt d.x fmt d.y fmt m * d.x c << 'n'; перед изменением кода

3. тогда это проблема, которую вы должны решить в первую очередь: прочитайте о линейной регрессии.

4. вектор содержит Data , который имеет x и y . Почему вы хотите вместо этого использовать два отдельных вектора?

Ответ №1:

Алгоритм работает со структурой, которая имеет оба x и y . Самым простым было бы скопировать ваши отдельные векторы в такую структуру:

 std::vector<Data> transform(const std::vector<double>amp; x, const std::vector<double>amp; y) {
     std::vector<Data> result(x.size());
     for (int i=0; i < x.size();   i) {
          result[i] = { x[i], y[i] };
     }
     return resu<
}
 

Это довольно дорого, потому что копирует все данные. Может быть, вы можете изменить код, который дает x результат, и y так, чтобы вместо этого он производил a std::vector<Data> . Если вы хотите изменить алгоритм, вам просто нужно заменить любое вхождение std::vector<Data> v на два отдельных std::vector<double> x,y , и каждый v[i].x на x[i] .

PS фактическая проблема с алгоритмом заключается в том, что он работает с контейнерами вместо итераторов. Если алгоритм будет использовать итераторы, было бы проще использовать его с контейнерами другого типа, без необходимости копировать данные или изменять алгоритм.

Комментарии:

1. @ahmadalibin вы можете поместить определение Data в отдельный заголовок и включить его там, где вам это нужно