【问题标题】:C++ Bitset array, accessing valuesC++ Bitset 数组,访问值
【发布时间】:2011-03-31 19:35:05
【问题描述】:


我的任务是从相邻节点列表中创建 图的邻接矩阵,存储在 file(不需要权重)中,放入 C++ 中的位集数组中。我成功地从文件中读取了相邻节点,但是当我尝试将其存储在 bitset 数组中时,结果不正确。 我的功能如下:

bitset<N>* read_graph(string filepath)
{
    FILE *fp;
    char line[100];
    bitset<N> bs[N];

    fp = fopen(filepath.c_str(), "r");

    if(fp != NULL)
    {
       while(!feof(fp))
       {   
          fgets(line, 100, fp);
          //cout << line << endl;
          if(line[0] == 'a')
          {
               string str = ""; 
               int i(0);    
               for(i = 2; line[i] != ' '; i++)
               {
                  if(line[i] != ' ')
                  {
                    str += line[i];
                  }     
               }
               int fi = atoi(str.c_str());
               i++;
               str = "";
               for(int j = i; line[j] != ' '; j++)
               {
                  if(line[j] != ' ')
                  {
                    str += line[j];
                  }     
               }    
               int si = atoi(str.c_str());
               si--;
               fi--;
               //cout << "string: " << str << endl;
               cout << "fi: " << fi;
               //cout << "string: " << str << endl;
               cout << "   si: " << si << endl;
               bs[fi][si]= 1;
          }
       }          
    }
    fclose(fp);

    return bs;
}

结果如下(fi 代表第一个索引,si 代表第二个索引):

sample.gr
fi: 0 si: 1
fi: 0 si: 2
fi: 1 si: 3
fi: 2 si: 4
fi: 3 si: 2
fi: 3 si: 5
fi: 4 si: 1
fi: 4 si: 5
fi: 4 si: 5

000000
000001
011000
001000
000000
000000

索引是正确的,我已经检查过了,但是矩阵应该如下(由于bitset的右侧定位,它被镜像):

000000
010001
001001
000010
000100
011000

我猜这个错误是在访问 bitset 元素的某个地方,但我无法找出究竟是什么错误。

感谢您的帮助。谢谢。

【问题讨论】:

  • 第一个观察:不能返回指向本地定义数组 bs 的指针。当函数返回时,这将被销毁。
  • 也许你可以给我们看一个输入文件的样本,并描述它应该是什么意思?有一些明显的问题,例如while (!feof(whatever)),但几乎不可能猜测它们与您所看到的问题有什么关系(甚至是否)。
  • 在第一行,“文件”是一个样本的链接。但是 我已经设法解决了它,在我根据 mkluwe 的评论对其进行了修改之后。非常感谢!

标签: c++ arrays graph bitset adjacency-matrix


【解决方案1】:

修复指向本地数组问题的指针后,您的代码将为我运行并打印预期的内容(镜像除外)。

但是在这种情况下使用 C++ I/O 不是更容易吗?

#include <vector>
#include <bitset>
#include <iterator>
#include <fstream>
#include <sstream>
#include <iostream>
const int N=6;
std::vector<std::bitset<N> > read_graph(const std::string& filepath)
{
    std::vector<std::bitset<N> > bs(N);
    std::ifstream fp(filepath.c_str());
    for(std::string line; getline(fp, line); )
    {
        if(line.size() > 1 && line[0] == 'a')
        {
            std::istringstream str(line.substr(1));
            int fi, si;
            str >> fi >> si;
            std::cout << "fi: " << fi << "   si: " << si << '\n';
            bs[--fi][--si]= 1;
        }
    }
    return bs;
}
int main()
{
    std::vector<std::bitset<N> > v = read_graph("sample.gr");
    copy(v.rbegin(), v.rend(),
         std::ostream_iterator<std::bitset<N> >(std::cout, "\n"));
}

试运行:https://ideone.com/z7Had

【讨论】:

    【解决方案2】:

    您正在返回一个指向本地数组的指针。未定义的行为。

    请改用vector&lt;bitset&lt;N&gt; &gt; 或类似名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      相关资源
      最近更新 更多