首页 > 解决方案 > 我怎样才能修改我的代码,以便给我看似输出?

问题描述

我的输入是这样的(前两行输入):

{4 <1,-1,-1> <1,1,-1> <-1,1,-1> <-1,-1,-1>} //first line
{4 <1,3,-1> <1,1,-1> <1,1,0.5> <1,3,0.5>}
{4 <1,3,-1> <-1,3,-1> <-1,1,-1> <1,1,-1>}
{4 <-1,3,-1> <-1,3,0.5> <-1,1,0.5> <-1,1,-1>}
{4 <1,3,0.5> <1,1,0.5> <0.75,1,1> <0.75,3,1>}
{4 <-0.75,3,1> <-0.75,1,1> <-1,1,0.5> <-1,3,0.5>}
{4 <-0.75,3,1> <0.75,3,1> <0.75,1,1> <-0.75,1,1>}
{4 <1,-1,0.5> <1,-0.75,1> <3,-0.75,1> <3,-1,0.5>}
{4 <1,-1,0.5> <3,-1,0.5> <3,-1,-1> <1,-1,-1>}
{4 <1,-1,-1> <3,-1,-1> <3,1,-1> <1,1,-1>} //tenth line

我有一个这样的代码,我希望按顺序读取每个括号,即 1、-1、-1,然后在输入文件中搜索它们以精细相似的括号并显示它们,但它没有:

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

using vecstr = vector<string>;

vecstr splitOut(const string &line) {
  size_t  pos = 0;
  vecstr result;
  while ( (pos=line.find('<',pos)) != string::npos ) {
    size_t endpos = line.find('>',pos);
    if ( endpos != string::npos ) {
      string token = line.substr(pos+1,endpos-pos-1);
      result.push_back(token);
    } else {

    }
    pos = endpos;
  }
  return result;
}

int main ( ) {

    ifstream iss("a.txt");
    string line;
    int offset;
    unsigned int curLine = 0;

    while (getline(iss,line)){
        string test = line;
        vecstr result = splitOut(test);
        for ( auto s : result ) {

            while(getline(iss, line)) { 
                curLine++;
                if ((offset = line.find(s, 0)) != string::npos) {
                cout << "found: " << s << " line: " << curLine << endl;
                }
            }
        }
    }
}

代码显示的所有输出(我的意思是它不考虑其他括号以及第一行显示的行不正确,它们应该是 9 和 10):

found: 1,-1,-1 line: 8
found: 1,-1,-1 line: 9

如何更改程序以向我显示这样的输出(例如对于第一个括号,即 1、-1、-1):

found: 1,-1,-1 line: 9
found: 1,-1,-1 line: 10

标签: c++

解决方案


如果我正确理解您的问题,您希望找到多次出现的数字三元组的行号。我建议保留一个unordered_map<string, int>将每个三元组映射到您看到的第一行的 a。

然后,您可以按如下方式构建您的程序:

  • 对于每一行,获取行上存在的三元组。(你已经有了)
  • 对于每个三元组:
    • 如果它出现在地图中,您发现了一个重复出现的三元组,请使用存储在地图中的行和当前行号进行报告。
    • 如果不存在,请将其与当前行号一起添加。

您可以通过使用比int. 例如,通过保留 a,pair<int, bool>您可以只记录第一次重复,然后停止。或者您pair<int, int>记录第一次出现和之后的重复次数。


推荐阅读