4

希望我能得到一些关于我所做的排序方法的建议。

这只是对我正在制作的另一个程序的测试,这个测试有一个我无法弄清楚的错误。此代码的目的是创建一个 int 指针数组,并按常规 int 数组的内容对该数组中的指针进行排序。

该错误是针对我的第二个 for 循环,它不允许我使用 aj!=-1 因此不允许我对数组的第一个元素进行排序。请帮忙。谢谢!!

 //create array
 int c[8] = {3,1,5,7,8,2,6,4};
 //create pointer array
 int *newptr[8];
 for(int k = 0; k<8; k++)
 {
     newptr[k] = &c[k];
 }
//sort pointer array
for(int j = 0; j<8; j++)
{
    cout << "test1\n\n";
    cout << *newptr[j] << "and" << *newptr[j+1];
    for(;*newptr[j] < *newptr[j+1] && j!=0; j--) 
    //using j!=-1 doesn't work which causes me to not be able to sort the first element
    //in the array properly
    {
        cout<< "test2";
        int *temp;
        temp = newptr[j+1];
        newptr[j+1] = newptr[j];
        newptr[j] = temp;
    }
}**
4

2 回答 2

8

订单很重要。

改变

for(;*newptr[j] < *newptr[j+1] && j!=0; j--) 

到:

for(; j != -1 && *newptr[j] < *newptr[j+1]; j--) 

据推测,该错误是导致代码崩溃的原因。发生这种情况是因为 for 循环中的表达式是从左到右计算的。所以在检查 if之前*newptr[j]被评估。所以可以想象,在某些时候,等于when被评估,这是非法的。j != -1j-1*newptr[j]

更改顺序确实有第二个原因:短路评估

在计算两个由两个条件A和组成的表达式时B,C++ 并不总是需要同时计算这两个条件。

例如在声明中

if (A && B) {
  //do something 
}

如果A被评估为,那么无论评估为什么false,显然A && B都无法评估为。So的值甚至从未被检查过。所以在你的情况下,在表达式中trueBB

j != -1 && *newptr[j] < *newptr[j+1]

如果j != -1为假,C++ 将不需要计算表达式的其余部分来知道整个表达式是否为假。所以*newptr[j]永远不会发生,你不会得到错误。

于 2013-08-05T05:38:47.080 回答
5

正如 maditya 所指出的,问题在于表达式在检查索引本身之前尝试访问无效索引,但我看到问题被标记为 C++。您是否有任何明确的理由不使用 STL?

struct sorter {
  bool operator() (const int* i, const int* j) { return (*i<*j);}
};

int c[8] = {3,1,5,7,8,2,6,4};
int *newptr[8];
for(int k = 0; k<8; k++)
  newptr[k] = &c[k];

std::sort(newptr, newptr+8, sorter());

在 C++11 中甚至更短:

int c[8] = {3,1,5,7,8,2,6,4};
int *newptr[8];
for(int k = 0; k<8; k++)
  newptr[k] = &c[k];
std::sort(newptr, newptr+8, [](const int *i, const int *j){return *i < *j;});
于 2013-08-05T05:47:03.270 回答