• C++中"was not declared in this scope"问题记录;以及通过正则表达式提取文件中数字的方法


     1 void Graph::InputListGene(bool TOG,int nbNodes,ifstream& f){
     2     string* line = new string[nbNodes];
     3     int count =0;
     4     while(!f.eof()){
     5         getline(f,line[count],';');
     6         count++;
     7     }
     8     for(int i=0;i<count;i++){
     9         Vertex *v = new Vertex(i);// to initialize
    10         v->color = 0; //O black & 1 white
    11         listVertex.push_back(v);
    12     }
    13     int p=0;
    14     regex pattern_node("\d+,\d+");
    15     for(int i=0;i<count;i++){
    16 
    17     for(sregex_iterator it(line[i].begin(),line[i].end(),pattern_node),end;it!=end;it++){
    18             char *cstr = new char[it->str().size()+1];
    19             char delim[]=",";//splitter of the numbers
    20             int dest,weight;
    21             strcpy(cstr,it->str().c_str());//convert string to char
    22             dest = atoi(strtok(cstr,delim));
    23             weight = atoi(strtok(NULL,delim));
    24             Vertex *v = new Vertex(dest);// to initialize
    25             v->color = 0; //O black & 1 white
    26             listVertex.push_back(v);
    27             cout<<dest<<" "<<weight<<" ";
    28             Edge *e = new Edge(p, listVertex[i],listVertex[dest],weight);
    29     }
    30     cout<<endl;
    31     }
    32 }
    33 // in file "Graph.cpp"

    这是Graph.cpp文件其中的一个函数,用于从txt文件中读取有向图的信息,并生成数据结构。

    相关数据类型的定义:

     

     

    11和26行之前碰到了was not declared in this scope 的问题,一开始很疑惑,在开头写了#include "Graph.h" ,而在Graph.h 文件中的类Graph中有public成员Vector<Vertex*> listVertex 。本以为用了include就能访问类成员。这里犯了一个低级错误。首先需要把函数声明为类的成员函数,然后在定义函数时在函数名前加上操作域解析符Graph:: 这样才能在函数中访问类的成员。

    另外,这个函数还实现了从txt文件中读取指定格式的数字并分别截取的办法。

    假设txt文件如下:

     图的结构如下:

     首先截取前3行的数据,第一行代表顶点个数,第二行有向(o)还是无向图(n);第三行表示邻接矩阵(m)还是邻接链表(l)。

     然后在下一个函数中处理其后的具体数据:

     将文件流作为参数传入,在这个函数中再getline()就是从文件的第四行开始了。geline把以分号结尾的每一行数据读入line数组中。

     首先,regex表示以逗号隔开的一个数对。这里用到了一个正则表达式迭代器sregex_iterator来遍历每一行数据,一开始的这个s表示这是一个作用于string类上的正则表达式迭代器。至于for里面的神奇写法,我好像也是从别处模仿来的,总之迭代器作用于当前line[]之上。

    it->str()应该就是匹配到的每一个数对(如:2,5)。strtok()函数只能处理char类型,于是先把这个数对由string转换到char,再对其用定义好的分隔符';'进行切割。得到的数对的第一个数就是指向的下一个邻接结点的编号;第二个便是这条边的权值。 

  • 相关阅读:
    Oracle 手工创建awr快照,获取报告
    Oracle块修改跟踪功能
    Oracle 反向索引(反转建索引) 理解
    oracle聚簇表的理解 (转自:https://blog.csdn.net/gumengkai/article/details/51009345 )
    Fix the iOS code signing issue when using Jenkins
    ios系统crash文件分析
    python版本管理
    python requirements.txt
    android makefile protoc路径添加
    初识tflite源码
  • 原文地址:https://www.cnblogs.com/mrlonely2018/p/11863837.html
Copyright © 2020-2023  润新知