gpt4 book ai didi

c++ - Vector int 交换实现?

转载 作者:行者123 更新时间:2023-12-03 07:30:58 24 4
gpt4 key购买 nike

我对以下 C++ vector 交换代码有一个简单的问题:

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class Base
{
private:
std::vector<int> vec;
public:
Base(std::vector<int> v) : vec(v) {}

std::vector<int> getVec() {
return vec;
}

void setVec(std::vector<int> vec) {
this->vec = vec;
}

void printVec() {
for (auto &v : vec) {
std::cout << v << std::endl;
}
}

void swap(Base b) {
std::vector<int> tmp = vec;

vec = b.getVec();

b.setVec(tmp);
}
};


int main()
{
std::vector<int> v1 = {1, 2, 3, 4};
std::vector<int> v2 = {5, 6, 7, 4};

Base b1(v1);
Base b2(v2);

b1.swap(b2);

b1.printVec();
b2.printVec();

return 0;
}

我希望程序能够打印(表明交换成功)

5                                                                                                                                                                                                                         
6
7
4
1
2
3
4

但它打印

5                                                                                                                                                                                                                         
6
7
4
5
6
7
4

所以看起来只有第一个 vector 被正确交换,而不是第二个 vector ,这段代码有什么问题?我很困惑,因为当我在交换函数中添加打印语句时,在我看来,第二个 vector 被正确交换,但随后它超出了范围???

最佳答案

swap 按值获取其参数,因此局部变量 b 只是参数的拷贝。任何修改(如b.setVec(tmp);)与原始参数无关。

将其更改为按引用传递,即

void swap(Base& b) {
std::vector<int> tmp = vec;

vec = b.getVec();

b.setVec(tmp);
}
<小时/>

PS:我想你想自己实现swap,否则你可以利用std::vector::swapstd::swap ,例如

void swap(Base& b) {
vec.swap(b.vec);
}

关于c++ - Vector int 交换实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59836133/

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