如何重载运算符 >> 以输入 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 不分配内存。它假定索引有效。因此,你得到了例外。

您可以:

  1. 使用std::vector::push_back,或
  2. 先调整对象大小再使用 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);