gpt4 book ai didi

c++ - 在 C++ 中对指针数组进行排序

转载 作者:太空狗 更新时间:2023-10-29 19:43:56 26 4
gpt4 key购买 nike

希望能对我做的排序方法得到一点建议。

这段代码的目的是创建一个 int 指针数组,并根据常规 int 数组的内容对该数组中的指针进行排序。然后根据原始 int 数组的位置为不同的变量赋值。

我在使用这段代码时遇到的奇怪之处在于,据我所知,测试代码不应该产生任何影响......实际上影响了我的指针的内容。也许值没有改变,但我编写测试代码的方式导致了错误。

 //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++)
{
for(; j > -1 && *newptr[j] < *newptr[j+1]; j--)
{
int *temp = newptr[j+1];
newptr[j+1] = newptr[j];
newptr[j] = temp;
}
}
//set lookuplocation
int lookuplocation;
for(int i = 0; i<8; i++)
{
cout << *newptr[i];

if(newptr[i] == &c[0])
{
cout << *newptr[i] << endl;

//If I use endl or \n to test the pointers values I end up with only
//a part of the correct data.

cout << "\nSuccess!\n";
lookuplocation = 0;
}
}
//Also for my last test sometimes the first element gets messed up as well
//test arrays
for(int k = 0; k<8; k++)
{
cout << "Element " << k << ": " << *newptr[k] << endl;
cout << "Element " << k << ": " << newptr[k] << endl;
}

最佳答案

我想有人可能真的需要以一种理智的方式对指针数组进行排序:

#include <iostream>
#include <array>
#include <algorithm>

int main() {
std::array<int, 8> arr { 3, 5, 4, 1, 2, 7, 6, 8 };
std::array<int*, 8> p_arr;

for (unsigned i = 0; i < 8; ++i) {
p_arr[i] = &arr[i];
}

std::sort(p_arr.begin(), p_arr.end(), [](int* a, int* b) { return *a < *b; });

for (auto i : p_arr)
std::cout << *i;
}

对于超过 zip 的范围,丑陋的中间循环完全可以被范围替换,但我现在没有自己的带有引用语义的实现,而且我懒得检查提升一个。1

Here's a live sample on Coliru .

此外,因为我认为我们应该一遍又一遍地重复这个,直到新手理解为止:

  • 不要重新发明分拣轮(除非是玩具实现)
  • 尽可能避免在 C++ 中使用指针。

1为了确保两个范围(在本例中为两个数组)具有相同的长度,这实际上很重要。不同的压缩约定要么要求范围具有相同的长度(崩溃或以其他方式抛出),要么在范围之一太短时填充空数据。虽然在如此简单的程序中看似显而易见,但在实际代码中要小心。

关于c++ - 在 C++ 中对指针数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18052204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com