C++中的指针数组排序算法
Pointer Array Sorting Algorithm in C++
希望我能得到一些关于我所做排序方法的建议。
这只是我正在做的另一个程序的测试,这个测试有一个我无法理解的错误。此代码的目的是创建一个int指针数组,并根据常规int数组的内容对该数组中的指针进行排序。
这个错误是针对我的第二个for循环,它不允许我使用j=-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 << "test1nn";
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;
}
}**
订单很重要。
更改
for(;*newptr[j] < *newptr[j+1] && j!=0; j--)
至:
for(; j != -1 && *newptr[j] < *newptr[j+1]; j--)
大概是这个错误导致了代码崩溃。发生这种情况是因为for循环中的表达式是从左到右求值的。因此,在检查j != -1
之前,对*newptr[j]
进行评估。因此,可以想象,在某个点上,当评估*newptr[j]
时,j
等于-1
,这是非法的。
改变顺序确实会产生影响,原因还有二:短路评估。
当对由两个条件A
和B
组成的表达式求值时,C++并不总是需要对这两个条件求值。
例如在语句中
if (A && B) {
//do something
}
如果A
被评估为false
,那么显然无论B
评估为什么,A && B
都不能评估为true
。因此B
的值甚至从未被检查过。因此,在您的情况下,在表达式中
j != -1 && *newptr[j] < *newptr[j+1]
如果j != -1
为false,C++将不需要对表达式的其余部分进行求值来知道整个表达式为false。所以*newptr[j]
永远不会发生,你也不会得到错误。
正如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;});
相关文章:
- 显示错误输出的简单数组排序程序
- 使用动态数组对算法编译器错误进行排序
- C 使用单个函数对具有多种值类型的数组排序
- 2D数组排序,空格打乱顺序
- C 2D数组排序
- C++数组排序 - 将"bbba"和"0001"视为不正确排序的问题
- 数组排序功能
- 我无法获得基于读取字符数组的算法来工作
- CString 数组排序
- 简单的数组排序/检查 划分和征服版本
- C++ 中的多维数组排序
- 选择在++中对并行数组排序
- C++:二维指针数组排序:选择排序不适用于某些实例
- 用于从包含最大求和的整数数组中提取子数组的算法
- 结构数组加倍算法C++
- 生成所有可能数组的算法
- C++字符串数组排序
- C++中的指针数组排序算法
- 在VC++6中使用向量进行数组排序时出错,而在VC++2012中没有错误
- 将索引数组排序为主数组