将指针数组排序到结构体内的结构体
我有一个指向数组结构体内结构体的指针数组,我想用它的字母对我的'graph []'进行排序。将指针数组排序到结构体内的结构体
我的问题是排序'结构顶点'内的'* 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;
}
}
//
首先,性病::排序很简单。你给它起始条目和结尾条目。
std::sort(graph[i].vertexes, graph[i].vertexes + 26, byLetter);
有26 vertexes
,所以它只需添加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来访问未初始化指针的地址。 – 0x499602D2 2014-09-06 22:07:18
是的,但我专注于编译错误。我只是要求OP澄清他想要分类的东西。 – PaulMcKenzie 2014-09-06 22:16:20
'结构顶点顶点* [26];''使用在struct'这种情况下是你的标志阅读'C'材料而不是'C++'材料。在C++中,在这种情况下不需要'struct'。 – PaulMcKenzie 2014-09-06 21:54:26
'std :: sort(vertexes,&vertexes [size],byLetter)'应该是'std :: sort(vertexes,vertexes + size,byLetter);','vertexes [size]'是一个等待发生的访问冲突! '&amp; graph [i] .vertexes [graph [i] .tam]' – BeyelerStudios 2014-09-06 21:57:07
'* A-> vertexes-> letter'试图解引用指针'A-> vertexes-> letter',甚至编译! – BeyelerStudios 2014-09-06 22:01:28