C++ c++;从给定的.dat文件将字符串向量转换为双精度向量

C++ c++;从给定的.dat文件将字符串向量转换为双精度向量,c++,file-io,vector,C++,File Io,Vector,所以我有很多问题,但我将从我认为应该是简单的问题开始。我被指派比较模板文件和查询文件,计算点积,并返回10个最近邻。我想我可以相当容易地进行计算,但是我在处理文件I/o时遇到了困难。我能够将数据读入字符串向量,但我不确定如何将其转换为双精度向量,同时保持顶点的完整性。如果我尝试使用字符串流或迭代器,我最终会得到分配给它自己的索引号的每个数字,而不是每行得到它自己的索引号。这是我的……你能帮我吗 为澄清目的编辑: 我将查询文件与包含图像集合的模板文件进行比较,以获得10个最近邻。查询文件包含一个“

所以我有很多问题,但我将从我认为应该是简单的问题开始。我被指派比较模板文件和查询文件,计算点积,并返回10个最近邻。我想我可以相当容易地进行计算,但是我在处理文件I/o时遇到了困难。我能够将数据读入字符串向量,但我不确定如何将其转换为双精度向量,同时保持顶点的完整性。如果我尝试使用字符串流或迭代器,我最终会得到分配给它自己的索引号的每个数字,而不是每行得到它自己的索引号。这是我的……你能帮我吗

为澄清目的编辑:

我将查询文件与包含图像集合的模板文件进行比较,以获得10个最近邻。查询文件包含一个“集合”(缺少更好的描述)。模板文件包含138行数据。现在,我想做的就是打印模板文件中的每一行数据,以及.dat文件中相应的索引号,但格式允许我进行必要的计算。一旦所有这些都完成了,我将需要计算两个向量之间的余弦(一个查询和模板中的第I行),因此我实际上需要断开模板的第I行,以便计算它和查询文件之间的余弦。这更清楚吗

以下是指向查询文件的链接: 以下是指向模板文件的链接:

示例输出类似于:“001_AU01_查询:15 20 135 19 36 22 105 95 55 68”,其中数字表示与查询数据最匹配的相应模板文件的行号

再次感谢你的帮助

void NearestNeighbor::readQuery(){
        vector<string> queryVector;
        string line;
            ifstream queryData;
        queryData.open("001_AU01_query.dat");
        if (queryData.fail()) {
            cout << "Unable to read query.dat file";
            exit(1);
        }
        //populate the vector with the template info
        while(getline(queryData, line, '\n')){
            queryVector.push_back(line);
        }
        //this prints the contents of the queryVector to the console
        for ( unsigned int i = 0; i < (queryVector.size()); i++){
            cout << "Index[" << i << "] " << queryVector[i] << endl;
        }
        queryData.close();
    }//end readQuery()
void NearestNeighbor::readQuery(){
向量查询向量机;
弦线;
ifstream queryData;
queryData.open(“001_AU01_query.dat”);
if(queryData.fail()){

cout您只需要选择正确的数据结构,其他一切都应该从该结构开始

由于无法跟踪每行数据中的值,因此单个一维
向量
将不起作用。但是,
向量
适合于将值存储在单行数据中。然后,每行只需要一个向量

因此,更合适的数据结构应该是
向量
。即2D向量:

void readQuery(std::istream& queryData){
  std::vector<std::vector<double>> queryVector;
  std::string line;

  while(getline(queryData, line, '\n'))
    queryVector.push_back(splitData(line));

  for (unsigned i = 0u; i != queryVector.size(); ++i) {
    std::cout << "Index[" << i << "] ";
    for(double value : queryVector[i])
        std::cout << value << " ";
    std::cout << "\n";
  }
}

在你的程序中没有“索引号”,只有向量中的位置,显然每个元素都有自己的位置。你不能有
vector
在向量中的同一个索引中有几个双精度。我认为你需要更好地解释这个问题,这可能会让你更好地理解它。一条“线”怎么办与“数字”对应?您的整个问题太模糊,任何人都无法提供帮助。如果您能向我们展示一个示例输入及其预期输出,那将更加清晰。@anmolSinghJaggi我更新了问题,将指向示例查询和模板数据以及预期输出的链接包括在内。再次感谢。这与我认为我需要的内容非常相似。自动输入是什么= 0U,但是…是那个助推还是C++ 11?我怎么用普通的OL’C++来做这个?谢谢你的帮助!@ USER 881751是的,代码“自动<代码>是C++ 11。我已经删除它了,因为用法有点无用。但是在我的例子中可能还有其他C++ 11(例如,基于范围的循环值超过一行中的值)。C++ C++ 11是C++的规则,C++ 14和C++是新的标准。现场演示链接。好的。我将把我的项目更新为C++11。我看过很多,所以使用它和/或新标准也是有意义的。我不确定它是否会在我学校的服务器上编译,但尝试一下也无妨。我真的很感谢你花时间帮助我。这些东西会让相对聪明的人觉得愚蠢,所以有时。我已经将我的项目更新为C++11,这正是我需要它做的。非常感谢。
std::vector<double> splitData(const std::string& line) {
  std::istringstream iss(line);
  std::istream_iterator<double> begin(iss);
  std::istream_iterator<double> end;
  return {begin, end};
}