c++ - 使用指针交换结构数组中的元素 C++

标签 c++

我看到几个类似的问题,但他们没有针对我的具体案例的答案。我只需要交换结构数组中两个元素的位置,但到目前为止我尝试过的所有内容都只会复制一个或另一个。我认为问题出在交换功能上。

我需要在不使用标准库函数的情况下执行此操作。这是我拥有的:

struct RentalCar {
    int year;
    char make[STRLEN];
    char model[STRLEN];
    float price;
    bool available;
};

void carCopy(RentalCar *dest, RentalCar *source) { // dest = source
    dest->year = source->year;
    myStrCpy(dest->make, source->make);            // copy c-strings
    myStrCpy(dest->model, source->model);
    dest->price = source->price;
    dest->available = source->available;
}

void carSwap(RentalCar *car1, RentalCar *car2) {
    RentalCar *carTemp = car1;
    carCopy(carTemp, car2);   // tried different orders, only copy no swap
    carCopy(car2, car1);
}

char *myStrCpy(char *dest, const char *source) {    // copy cstring
    char *origin = dest;                            // non iterated address
    while (*source || *dest) {
        *dest = *source;
        dest++;
        source++;
    }
    return origin;  // could return void instead
}

最佳答案

您将浅拷贝与深拷贝混合在一起:

void carSwap(RentalCar *car1, RentalCar *car2) {
    RentalCar *carTemp = car1; // shallow copy
    carCopy(carTemp, car2);   // deep copy: overrides carTemp AND car1
    carCopy(car2, car1); // car1 and car2 already have the same values
    // original car1 data is lost
}

因为 carSwap 被赋予 RentalCar*(而不是 RentalCar**)我们不能改变用户的指针,所以我们必须坚持深拷贝。

我们可以这样做(并且仍然使用其他功能):

void carSwap(RentalCar *car1, RentalCar *car2) {
    RentalCar carTemp = *car1;
    carCopy(car1, car2);
    carCopy(car2, &carTemp);
}

但我们不需要其他功能。我们可以这样做:

void carSwap(RentalCar *car1, RentalCar *car2) {
    RentalCar carTemp = *car1;
    *car1 = *car2;
    *car2 = carTemp;
}

关于c++ - 使用指针交换结构数组中的元素 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50769780/

相关文章:

C++ quicksort 排序字符串文本

c++ - 使用用户输入的数据创建结构数组

具有按签名和类型指向成员函数的指针的 C++ 模板

c++ - 在哪里可以找到 Visual Studio 2005 的远程调试器?

C++将int转换为具有未知基数的字符串的简单方法

C++ map::find 或 map::iterator 哪个更有效 w.r.t 复杂性

c++ - 为什么编译器不抛出编译错误?

c++ - 带有资源和 header 声明 : invalid keyword 的 OOP

c++ - CodeLite 不会检测(安装)MinGW——即使手动配置也不会编译

C++ float 存储