如何重载运算符 >> 以输入 class 的向量值?
How to overload operator >> to enter vector values of a class?
我试图找到一种方法让用户定义 int 向量的长度,它是 class 的私有成员,然后通过控制台插入所有数字,但是,我没有发现任何专门为矢量设计的重载。这是我的代码,它得到:“异常:std::out_of_range 在内存位置。”当它到达 for 循环时。
#include <iostream>
#include<vector>
using namespace std;
class List
{
private:
vector<int> numbers;
public:
List(){vector<int> numbers = {};}
friend istream& operator>>(istream& i, const List& l);
};
istream& operator>>(istream& i, const List& l)
{
int help{ 0 };
i >> help; //I used help to define the amount of numbers to be added
for (int i{ 0 }; i < help; i++) //exception: std::out_of_range at memory location
i >> l.numbers.at(i);
return i;
}
int main()
{
List list;
cin >> list;
return 0;
}
为了减少代码,我已经删除了运算符<<,如果您需要,我会发送给您。任何帮助、解决方案或 link 到我可以学习如何解决这个问题的地方,将不胜感激。
int help{ 0 };
i >> help; //I used help to define the amount of numbers to be added
for (int i{ 0 }; i < help; i++) //exception: std::out_of_range at memory location
i >> l.numbers.at(i);
return i;
肯定会导致超出范围的异常。 std::vector
是空的,所以它会将 i
处的元素(超出范围)设置为某个值。此外,循环中的 i
掩盖了 std::istream
i
.
您可以将其更改为:
int help{ 0 };
i >> help; //I used help to define the amount of numbers to be added
l.numbers.resize(help);
for (int counter{ 0 }; counter < help; counter++) //exception: std::out_of_range at memory location
i >> l.numbers.at(counter);
return i;
- 您必须在读取那里之前添加元素,或者读取值并添加具有之后值的元素。
- 用作循环变量的
i
正在隐藏流 i
。你必须给其中任何一个起另一个名字。
- 更新向量
l.numbers
意味着修改对象l
,因此不能将对象标记为const
。
试试这个:
阅读前添加元素:
istream& operator>>(istream& is, List& l)
{
int help{ 0 };
is >> help; //I used help to define the amount of numbers to be added
l.numbers.resize(help); // create help elements
for (int i{ 0 }; i < help; i++)
is >> l.numbers.at(i);
return is;
}
读取值并添加元素:
istream& operator>>(istream& is, List& l)
{
int help{ 0 };
is >> help; //I used help to define the amount of numbers to be added
l.numbers.clear(); // remove all elements
for (int i{ 0 }; i < help; i++)
{
int value;
is >> value; // read value
l.numbers.push_back(value); // add the value
}
return is;
}
std::vector::at
不分配内存。它假定索引有效。因此,你得到了例外。
您可以:
- 使用
std::vector::push_back
,或
- 先调整对象大小再使用
std::vector::at
.
选项 1
for (int i{ 0 }; i < help; i++)
i >> l.numbers.push_back(i);
选项 2
l.numbers.resize(help);
for (int i{ 0 }; i < help; i++)
i >> l.numbers.at(i);
我试图找到一种方法让用户定义 int 向量的长度,它是 class 的私有成员,然后通过控制台插入所有数字,但是,我没有发现任何专门为矢量设计的重载。这是我的代码,它得到:“异常:std::out_of_range 在内存位置。”当它到达 for 循环时。
#include <iostream>
#include<vector>
using namespace std;
class List
{
private:
vector<int> numbers;
public:
List(){vector<int> numbers = {};}
friend istream& operator>>(istream& i, const List& l);
};
istream& operator>>(istream& i, const List& l)
{
int help{ 0 };
i >> help; //I used help to define the amount of numbers to be added
for (int i{ 0 }; i < help; i++) //exception: std::out_of_range at memory location
i >> l.numbers.at(i);
return i;
}
int main()
{
List list;
cin >> list;
return 0;
}
为了减少代码,我已经删除了运算符<<,如果您需要,我会发送给您。任何帮助、解决方案或 link 到我可以学习如何解决这个问题的地方,将不胜感激。
int help{ 0 };
i >> help; //I used help to define the amount of numbers to be added
for (int i{ 0 }; i < help; i++) //exception: std::out_of_range at memory location
i >> l.numbers.at(i);
return i;
肯定会导致超出范围的异常。 std::vector
是空的,所以它会将 i
处的元素(超出范围)设置为某个值。此外,循环中的 i
掩盖了 std::istream
i
.
您可以将其更改为:
int help{ 0 };
i >> help; //I used help to define the amount of numbers to be added
l.numbers.resize(help);
for (int counter{ 0 }; counter < help; counter++) //exception: std::out_of_range at memory location
i >> l.numbers.at(counter);
return i;
- 您必须在读取那里之前添加元素,或者读取值并添加具有之后值的元素。
- 用作循环变量的
i
正在隐藏流i
。你必须给其中任何一个起另一个名字。 - 更新向量
l.numbers
意味着修改对象l
,因此不能将对象标记为const
。
试试这个:
阅读前添加元素:
istream& operator>>(istream& is, List& l)
{
int help{ 0 };
is >> help; //I used help to define the amount of numbers to be added
l.numbers.resize(help); // create help elements
for (int i{ 0 }; i < help; i++)
is >> l.numbers.at(i);
return is;
}
读取值并添加元素:
istream& operator>>(istream& is, List& l)
{
int help{ 0 };
is >> help; //I used help to define the amount of numbers to be added
l.numbers.clear(); // remove all elements
for (int i{ 0 }; i < help; i++)
{
int value;
is >> value; // read value
l.numbers.push_back(value); // add the value
}
return is;
}
std::vector::at
不分配内存。它假定索引有效。因此,你得到了例外。
您可以:
- 使用
std::vector::push_back
,或 - 先调整对象大小再使用
std::vector::at
.
选项 1
for (int i{ 0 }; i < help; i++)
i >> l.numbers.push_back(i);
选项 2
l.numbers.resize(help);
for (int i{ 0 }; i < help; i++)
i >> l.numbers.at(i);