【问题标题】:Sorting an array of pointers to structs inside a struct [closed]对结构内结构的指针数组进行排序[关闭]
【发布时间】:2014-09-06 21:48:38
【问题描述】:

我有一个指向结构数组内结构的指针数组,我想按字母对我的“graph[]”进行排序。

我的问题是对 'struct vertex' 中的 '*vertexes[]' 进行排序。现在我不能在'*vertexes[]'内的每个指针中显示'字母'......

这是带有 PaulMcKenzie 更正的代码:

#include <algorithm> //std::sort()
#include <cstdio> //std::scanf(), std::putchar()
//
struct vertex {
    vertex *vertexes[26];
    vertex **end; //Do the same as 'size'
    unsigned int size;
    char letter;
    void insert(vertex *dest) { vertexes[size] = dest; ++size; /* or *end = dest; end+=1; */ }
    bool empty(void) const { return(this->size == 0); /* or return(vertexes == end); */ }
};
//
bool byLetter(const vertex *A, const vertex &B)
{
    return(A->letra < B->letra);
}
//
int main(void)
{
  unsigned int n(0), N, A, v, V;
  char ini, fim;
  vertex graph[26]; //Each one represents a letter of the alphabet
  std::scanf("%u ", &N);
  while(n++ < N) {
    for(v = 0; v < 26; ++v) {
      graph[v].size = 0;
      graph[v].end = graph[v].vertexes;
      graph[v].letter = v+'a';
    }
    std::scanf("%u %u ", &V, &A);
    do {
      std::scanf("%c %c ", &ini, &fim);
      graph[ini-'a'].insert(&graph[fim-'a']);
    } while(--A != 0);
    for(v = 0; v < V; ++v) {
      if(!graph[v].empty()) {
          std::sort(graph[v].vertexes, &graph[v].vertexes[graph[v].size], byLetter);
          //Not sure why graph[v] + size is more safe then this...
          graph[v].show(); //Problem here
      }
    }
    std::putchar('\n');
  }
  return(0);
}
//
void vertex::show(void)
{
  vertex **p(vertexes); //'p' iterates thought vertexes 
  while(p != end) { //but I can't access the letter in each pointer 
    std::putchar(*(*p->vertexes->letter)); // problem here
    std::putchar(',');
    p+=1;
   }
}
//

【问题讨论】:

  • struct vertex *vertexes[26]; 在这种情况下使用struct 表示您正在阅读C 材料而不是C++ 材料。在 C++ 的上下文中不需要struct
  • std::sort(vertexes, &amp;vertexes[size], byLetter) 应该是std::sort(vertexes, vertexes + size, byLetter);vertexes[size] 是等待发生的访问冲突! &amp;graph[i].vertexes[graph[i].tam] 也是如此
  • *A-&gt;vertexes-&gt;letter 正在尝试取消引用指针 A-&gt;vertexes-&gt;letter,它甚至无法编译!
  • 什么是 tam ?是graph::sort(void) 还是vertex::sort(void)
  • 我给出了答案,但您应该明确说明您要排序的内容。您在main 中定义了一个图形数组,那么您是否尝试按字符对graph 数组进行排序?

标签: c++ arrays pointers struct


【解决方案1】:

首先,std::sort 很简单。你给它一个开始条目和结束条目。

    std::sort(graph[i].vertexes, graph[i].vertexes + 26, byLetter);

vertexes 有 26 个,所以只需将 26 加到最后一个即可。

下一个问题是,既然vertexes 是一个指针数组,那么函数byLetter 将被传递两个指向vertex 的指针,而不是两个引用:

bool byLetter(const vertex *A, const vertex *B)
{
    return(A->letter < B->letter);
}

将它们放在一起,并消除将struct 到处乱放的 C 主义,这是您程序的简单版本:

#include <algorithm> 

struct vertex {
    vertex *vertexes[26];
    unsigned int size;
    char letter;
    void sort(void);
};

bool byLetter(const vertex *A, const vertex *B)
{
    return(A->letter < B->letter);
}

int main()
{
    unsigned int i;
    vertex graph[26];
    for(i = 0; i < 26; ++i) {
        std::sort(graph[i].vertexes, graph[i].vertexes + 26, byLetter);
    }
}

【讨论】:

  • 更不用说std::sort() 没有做任何事情,并且可能有 UB 用于访问未初始化指针的地址。
  • 是的,但我关注的是编译错误。我只是要求 OP 澄清他试图排序的内容。
猜你喜欢
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 2014-07-04
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多