vector 返回 0 的 size()
vector is returning a size() of 0
我是 C++ 编程的新手,我在使用以下代码时遇到问题:
#include <iostream>
#include <vector>
using namespace std;
class Absolute {
public:
vector<int> nums;
Absolute(vector<int> nums) {
nums = nums; //<--- this size is not 0
}
vector<int> getNums() { return nums; }
int addr() {
int total = 0;
for(int i=0; i<nums.size(); i++) { //<--- nums.size() here is 0 even though it should not be
total += nums[i];
}
return total;
}
};
int main() {
vector<int> numbers = {1, 3, 3, 4, 5, 6, 7, 8}; //<--- passing this to addNums but still returns size of 0
Absolute addNums = Absolute(numbers);
cout << addNums.addr() << endl;
return 0;
}
我的目标是使用 addr()
方法将 vector
中的所有数字相加,但由于某种原因 vector
的大小在 addr()
方法,所以我最终打印了这些非常大的数字:
15152333321
这是怎么回事?会不会是它一开始就没有用 vector
初始化?
如@Eljay 所述,在 Absolute 构造函数中,您的参数和成员变量具有相同的名称。
这个变化
Absolute(vector<int> nums) {
this->nums = nums; //<--- this size is not 0
}
如果您真的想保留相同的名称,那么您的示例应该足够了。我强烈建议您为参数取一个不同的名称,例如 _nums。
在此代码中:
Absolute(vector<int> nums)
{
nums = nums;
}
你遇到我说的“汉兰达法则”(There can be only one). In this function, nums
refers to the parameter nums
, not the member nums
. The member nums
is shadowed,隐藏,被参数。所以nums = nums;
表示把参数赋值给自己。成员nums
不变,保持大小为 0。
修复:您可以更改其中一个变量的名称,以免它们发生冲突。您可以使用 this->nums = nums
更加明确,但还有一个更好更快的选择:使用 member initializer list 并使用正确的值初始化成员 nums
而不是将其初始化为默认值然后赋值它。
Absolute(vector<int> nums): nums(nums)
{
}
这里可以使用相同的名称,因为没有歧义。正在初始化成员 nums
,因此它必须是 left-most nums
。它被初始化为参数nums
,因为该参数是标识符nums
.
的当前持有者
旁注:考虑通过引用传递并为自己保存一份副本:
Absolute(const vector<int> & nums): nums(nums)
{
}
我是 C++ 编程的新手,我在使用以下代码时遇到问题:
#include <iostream>
#include <vector>
using namespace std;
class Absolute {
public:
vector<int> nums;
Absolute(vector<int> nums) {
nums = nums; //<--- this size is not 0
}
vector<int> getNums() { return nums; }
int addr() {
int total = 0;
for(int i=0; i<nums.size(); i++) { //<--- nums.size() here is 0 even though it should not be
total += nums[i];
}
return total;
}
};
int main() {
vector<int> numbers = {1, 3, 3, 4, 5, 6, 7, 8}; //<--- passing this to addNums but still returns size of 0
Absolute addNums = Absolute(numbers);
cout << addNums.addr() << endl;
return 0;
}
我的目标是使用 addr()
方法将 vector
中的所有数字相加,但由于某种原因 vector
的大小在 addr()
方法,所以我最终打印了这些非常大的数字:
15152333321
这是怎么回事?会不会是它一开始就没有用 vector
初始化?
如@Eljay 所述,在 Absolute 构造函数中,您的参数和成员变量具有相同的名称。
这个变化
Absolute(vector<int> nums) {
this->nums = nums; //<--- this size is not 0
}
如果您真的想保留相同的名称,那么您的示例应该足够了。我强烈建议您为参数取一个不同的名称,例如 _nums。
在此代码中:
Absolute(vector<int> nums)
{
nums = nums;
}
你遇到我说的“汉兰达法则”(There can be only one). In this function, nums
refers to the parameter nums
, not the member nums
. The member nums
is shadowed,隐藏,被参数。所以nums = nums;
表示把参数赋值给自己。成员nums
不变,保持大小为 0。
修复:您可以更改其中一个变量的名称,以免它们发生冲突。您可以使用 this->nums = nums
更加明确,但还有一个更好更快的选择:使用 member initializer list 并使用正确的值初始化成员 nums
而不是将其初始化为默认值然后赋值它。
Absolute(vector<int> nums): nums(nums)
{
}
这里可以使用相同的名称,因为没有歧义。正在初始化成员 nums
,因此它必须是 left-most nums
。它被初始化为参数nums
,因为该参数是标识符nums
.
旁注:考虑通过引用传递并为自己保存一份副本:
Absolute(const vector<int> & nums): nums(nums)
{
}