gpt4 book ai didi

c++ - 作用于整数 vector 的循环表现异常

转载 作者:行者123 更新时间:2023-11-28 00:03:46 25 4
gpt4 key购买 nike

#include <iostream>
#include <vector>

std::vector<int> normalize(std::vector<int> a) {
for (int j = a.size() - 1; j > 0; --j) {
while (a[j] > 9) {
a[j] = a[j] - 10;
std::cout << '!'; //Just to test if the loop is executed (the correct # of times)
++a[j - 1];
}
}
// checks that the last digit isnt too large, makes new digit otherwise
if (a[0] > 9) {
a.insert(a.begin(), 0);
while (a[1] > 9) {
a[1] -= 10;
++a[0];
}
}

return a;
}
// for debugging convenience
void printVector(std::vector<int> a) {
for (int i = 0; i < a.size(); ++i) {
std::cout << a[i] << ' ';
}
std::cout << std::endl;
}

int main()
{

std::vector<int> a;
a.push_back(1); a.push_back(2); a.push_back(33);
normalize(a);
printVector(a);

return 0;
}

此程序将大整数表示为数字列表,规范化函数会将 {1,2,33} 更改为 {1,5,3},例如表示 153。我是 C++ 的新手,所以我没有使用类,也没有使用任何可以更好地实现这一切的大整数 header 。

返回:!!!1 2 33就好像 vector 没有改变一样。但是,“std::cout '!'”行如何打印正确的次数,甚至 while 循环完全终止?

最佳答案

在你的函数中

std::vector<int> normalize(std::vector<int> a)

您正在按值传递 a,因此一旦函数退出,它就不会被修改。为了让它工作,你应该使用你当前的实现作为

auto result = normalize(a); // now we get the result
printVector(result); // and display it

为避免制作不必要的拷贝,您应该通过 const 引用传递参数:

std::vector<int> normalize(std::vector<int> const& a)

如果你想修改传递给你的函数的参数,你应该通过引用传递:

std::vector<int> normalize(std::vector<int>& a) // now we can modify a

但是,将函数实现为无副作用的黑盒(如果可能)是个好主意,因为这将使测试和多线程更容易,所以我建议通过 const 引用传递然后返回结果。

关于c++ - 作用于整数 vector 的循环表现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36962408/

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