You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

作业难题:如何用swap函数交换二维数组指针存储的地址实现排序?

解决通过交换指针地址为vector数组排序的问题

嘿,我完全懂你现在的困扰——要给一组vector数组排序,但作业要求绝对不能交换vector里的元素值,只能通过交换存储这些vector地址的指针数组里的地址来实现,结果用标准swap尝试却没成功,搜相关问题还大多是修改指针指向值的方案,根本不是你要的交换指针本身对吧?

问题根源:你可能没搞对指针交换的对象

如果之前用swap没生效,大概率是你操作的是指针的副本而非指针数组里的实际元素。比如如果写了类似swap(ptr1, ptr2)但ptr1和ptr2是从数组里复制出来的指针,那交换的只是临时变量,原数组里的指针地址根本没变化。

正确的实现思路

核心逻辑是:我们要排序的是存储vector地址的指针数组,排序时比较指针指向的vector内容,交换的是指针数组里的两个指针(也就是它们存储的vector地址),而vector本身的内容和位置完全不动。

具体代码示例

下面用C++给你写一个完整的可运行示例,包含自定义排序规则、指针数组排序和结果打印:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 自定义比较器:按vector的默认升序规则比较(可根据需求修改)
bool compareVectorPointers(const vector<int>* vecPtrA, const vector<int>* vecPtrB) {
    // 直接比较指针指向的vector对象
    return *vecPtrA < *vecPtrB;
}

int main() {
    // 初始化几个待排序的vector
    vector<int> vec1 = {3, 1, 4};
    vector<int> vec2 = {1, 2, 3};
    vector<int> vec3 = {2, 5, 1};

    // 创建指针数组,存储每个vector的地址
    vector<int>* ptrArray[] = {&vec1, &vec2, &vec3};
    int arrSize = sizeof(ptrArray) / sizeof(ptrArray[0]);

    // 对指针数组排序:交换的是数组里的指针地址,而非vector内容
    sort(ptrArray, ptrArray + arrSize, compareVectorPointers);

    // 通过指针数组打印排序后的结果
    cout << "排序后的vector结果:" << endl;
    for (int i = 0; i < arrSize; ++i) {
        for (int num : *ptrArray[i]) {
            cout << num << " ";
        }
        cout << endl;
    }

    return 0;
}

关键细节说明

  1. 比较器的作用:compareVectorPointers函数接收两个vector指针,通过*vecPtrA访问指针指向的vector对象,用vector默认的<运算符比较(你可以改成自己需要的规则,比如按vector的大小排序:return vecPtrA->size() < vecPtrB->size();)。
  2. sort函数的用法:这里的sort是对指针数组ptrArray进行排序,排序过程中会调用我们的比较器,交换的是数组里的指针元素(也就是vector的地址),完全不会修改vector本身的内容。
  3. 如果自己实现排序算法:比如冒泡排序,直接在循环里交换ptrArray[j]和ptrArray[j+1]即可,因为它们是指针数组的元素,交换的就是存储的地址,示例如下:
void bubbleSortPointers(vector<int>* ptrArray[], int size) {
    for (int i = 0; i < size - 1; ++i) {
        for (int j = 0; j < size - i - 1; ++j) {
            if (*ptrArray[j] > *ptrArray[j+1]) {
                // 直接交换指针数组里的两个指针地址
                swap(ptrArray[j], ptrArray[j+1]);
            }
        }
    }
}

这样实现就完全符合作业要求:没有修改任何vector里的元素值,只是通过调整指针数组里的地址顺序,实现了“排序”的效果,最后通过指针数组打印就能得到有序的结果。

内容的提问来源于stack exchange,提问作者Tallguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:09:58