【问题标题】:Importing csv file and then sort it with c++导入csv文件,然后用c ++对其进行排序
【发布时间】:2018-11-24 04:18:16
【问题描述】:

我有一个项目告诉我导入一个 csv 文件然后对其进行排序(该文件包含数百万个数字)。我搜索了一个合并排序源代码并找到了这个,我尝试了它并且排序正在工作。 (我通过 Virtual Box 在 ubuntu 中使用 g++ 编译了这段代码)。

#include<iostream>
#include<vector>

using namespace std;

void print(vector<int> v)
{
  for(int i = 0; i < v.size(); i++) cout << v[i] << " ";
  cout << endl;
}

vector<int> merge(vector<int> left, vector<int> right)
{
   vector<int> result;
   while ((int)left.size() > 0 || (int)right.size() > 0) {
      if ((int)left.size() > 0 && (int)right.size() > 0) {
         if ((int)left.front() <= (int)right.front()) {
            result.push_back((int)left.front());
            left.erase(left.begin());
         } 
   else {
            result.push_back((int)right.front());
            right.erase(right.begin());
         }
      }  else if ((int)left.size() > 0) {
            for (int i = 0; i < (int)left.size(); i++)
               result.push_back(left[i]);
            break;
      }  else if ((int)right.size() > 0) {
            for (int i = 0; i < (int)right.size(); i++)
               result.push_back(right[i]);
            break;
      }
   }
   return result;
}

vector<int> mergeSort(vector<int> m)
{
   if (m.size() <= 1)
      return m;

   vector<int> left, right, result;
   int middle = ((int)m.size()+ 1) / 2;

   for (int i = 0; i < middle; i++) {
      left.push_back(m[i]);
   }

   for (int i = middle; i < (int)m.size(); i++) {
      right.push_back(m[i]);
   }

   left = mergeSort(left);
   right = mergeSort(right);
   result = merge(left, right);

   return result;
}

int main()
{
   vector<int> v;

   v.push_back(38);
   v.push_back(27);
   v.push_back(43);
   v.push_back(3);
   v.push_back(9);
   v.push_back(82);
   v.push_back(10);

   print(v);
   cout << "------------------" << endl;

   v = mergeSort(v);

   print(v);
}

但是当我插入代码导入csv文件时,它只读取文件并且没有运行排序,是我放错了吗?这是我的代码:

#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <cstdlib>
#include <stdlib.h>

using namespace std;

const int jumlahData = 999999;
double data[jumlahData] = {0};

void loadData(const char* namaFile) {
    string line;
    ifstream myfile (namaFile);

    if (myfile.is_open()) {
        int counter = 0;
        while (getline(myfile, line, ',')) {
            //cout << line << '\n';
            data[counter] = stod(line);
            counter++;
        }
        myfile.close();
    }
}

void print(vector<int> v)
{
  for(int i = 0; i < v.size(); i++) cout << v[i] << " ";
  cout << endl;
}

vector<int> merge(vector<int> left, vector<int> right)
{
   vector<int> result;
   while ((int)left.size() > 0 || (int)right.size() > 0) {
      if ((int)left.size() > 0 && (int)right.size() > 0) {
         if ((int)left.front() <= (int)right.front()) {
            result.push_back((int)left.front());
            left.erase(left.begin());
         } 
   else {
            result.push_back((int)right.front());
            right.erase(right.begin());
         }
      }  else if ((int)left.size() > 0) {
            for (int i = 0; i < (int)left.size(); i++)
               result.push_back(left[i]);
            break;
      }  else if ((int)right.size() > 0) {
            for (int i = 0; i < (int)right.size(); i++)
               result.push_back(right[i]);
            break;
      }
   }
   return result;
}

vector<int> mergeSort(vector<int> m)
{
   if (m.size() <= 1)
      return m;

   vector<int> left, right, result;
   int middle = ((int)m.size()+ 1) / 2;

   for (int i = 0; i < middle; i++) {
      left.push_back(m[i]);
   }

   for (int i = middle; i < (int)m.size(); i++) {
      right.push_back(m[i]);
   }

   left = mergeSort(left);
   right = mergeSort(right);
   result = merge(left, right);

   return result;
}

int main()
{
   vector<int> v;

   loadData("dataDemo.csv");

   print(v);
   cout << "------------------" << endl;

   v = mergeSort(v);

   print(v);
}

【问题讨论】:

  • 你可以使用std::sort
  • 你的loadData写在哪里main::v
  • ...另外,注释您的代码,以便我们了解您的方向的目的是什么。
  • 您的文件数据存储在全局数组double data[],而不是vector&lt;int&gt;

标签: c++ csv merge mergesort


【解决方案1】:

您的loadData("dataDemo.csv"); 调用不会写入先前声明的本地vector&lt;int&gt; v;。您的向量 v 没有元素。您需要编写一个基于double data[jumlahData] 的内容填充向量v 的方法 即..

int main()
{
   vector<int> v;

   loadData("dataDemo.csv");
   populateVectorWithData(v, data); //TODO implement me
   print(v);
   cout << "------------------" << endl;

   v = mergeSort(v);

   print(v);
}

【讨论】:

  • 除了读入数组并复制到vector,而不是直接读入vector之外。如果引用提问者的话,[t]他的文件包含数百万个数字,并且数组大小小于一百万,那么使用数组似乎是一个非常糟糕的主意。向提问者提供一些代码演示 loadDatavector 并使用 push_back 不会剥夺他们太多的教育。
  • 对不起,你能告诉我怎么做吗?我有点理解你的回答,但我不知道要写什么语法以及应该放在哪里。谢谢先生。
【解决方案2】:

正如其他人指出的那样,您没有对读入的实际数据进行排序。这可以通过返回您读入的数据点的计数来轻松解决。

我怀疑您正在尝试的一种更好的方法是将向量的引用从 main 发送到 loadDatapush_back 向量上的数据。此外,建议尽可能使用您的实现提供的库。换句话说,不要重新发明轮子,只需使用&lt;algorithm&gt; 而不是您自己或其他人的排序算法。它有助于防止讨厌的错误。

int main()
{
  //return the count of integers read into data[] in loadData()
  //also change the vector & array types to be consistent, please!
  std::vector<int> v (data, loadData("dataDemo.csv");

  print(v);   //print the loaded vector
  cout << "------------------" << endl;

  std::sort(v.begin(), v.end());  // using <algorithm> (̶i̶t̶'̶s̶ ̶q̶u̶i̶c̶k̶s̶o̶r̶t̶)̶

  print(v);
}

【讨论】:

  • 这是快速排序实际上yyyy...它通常不是。如今,它往往被称为introsort
  • 对不起,我忘了告诉,我只允许在合并/遗传排序之间进行选择,所以我可以使用这种方法吗?谢谢。
  • loadData 中,您使用counter++ 来计算您读入了多少个数字。我们在main 中构造的v 需要知道这一点,并且还需要知道data 的位置,因此我这样做std::vector&lt;int&gt; v (data, loadData("dataDemo.csv");。请注意,我在构造函数中包含了函数调用,这意味着vloadData 返回 后完成构造,并带有count 变量。
猜你喜欢
  • 2013-12-12
  • 2013-02-10
  • 2013-01-23
  • 2017-03-19
  • 1970-01-01
  • 2016-10-20
  • 2020-02-12
  • 1970-01-01
  • 2020-05-17
相关资源
最近更新 更多