重载运算符>>并向字符串添加数字

Overloading >> operator and adding a number to a string

本文关键字:gt 添加 数字 字符串 重载 运算符      更新时间:2023-10-16

im在获取向字符串添加数字的函数时遇到问题。这些数字来自矩阵,是整数。我试图将它们解析为格式为{{a,b,c},{d,e,f},{g,h,i}}的字符串。已经实现了代码,但当我运行它时,数字应该在哪里,它是空白的,我不知道为什么。

我的功能:

    istream& operator>>(istream& in, Matrix& m) {
    vector<int> vec;
    vec = m.getRow(0);
    string matrix = "{";
    in >> matrix;
    for (int i = 0; i < vec.size(); i++){
        vector<int> vecRow = m.getRow(i);
        matrix+= " {";
        for (int j = 0; j < vec.size(); j++){       
            if(j >=vec.size()-1){
                matrix += vecRow[j];
            }else{
                matrix +=  vecRow[j] + ", " ;
            }
        }
        vecRow.clear();
        matrix+= "}";
        vecRow = m.getRow(i);
    }
    matrix+= " }";
    cout<< matrix<<endl;
    return in;
}

好的,所以我修改了它,现在我没有错误,但当我在测试仪(cin>>矩阵)中调用这个函数时,它冻结了,之后什么也没发生。

重载提取运算符>>时,需要使用传入的参数(std::istream& in, ...)从流中获取数据,而不是全局std::cin流。

有点像这样让你开始:

#include<iostream>
struct Matrix {};
std::istream& operator>>(std::istream& is, Matrix& m)
{
    // input format: {{a,b,c},{d,e,f},{g,h,i}}
    char c;
    // we expect the first char to be '{'
    if(is.get(c) != '{')
        is.setstate(std::ios::failbit); // signal error
    else
    {
        // now process the middle part:
        // {a,b,c},{d,e,f},{g,h,i}
        // ...
        // then check the end brace '}'
        if(is.get(c) != '}')
            is.setstate(std::ios::failbit); // signal error
    }
    return is;
}

但事实证明,您正在做相反的事情——向输出写入Matrix

在这种情况下,您需要使用插入运算符<<,并将const引用传递给Matrix

写入(std::ostream& os, ...)参数,如下所示:

std::ostream& operator<<(std::ostream& os, const Matrix& m)
{
    // output format: {{a,b,c},{d,e,f},{g,h,i}}
    os << '{'; // initial brace
    // loop on each row
    for(unsigned row = 0; row < m.getSize(); ++row)
    {
        const std::vector<int>& vecRow = m.getRow(row);
        // output one row {a,b,c} item here
        os << '{'; // open row brace
        // loop on each item
        for(unsigned i = 0; i < vecRow.size(); ++i)
        {
            // ,,,
        }
        os << '}'; // close the row
    }
    os << '}'; // close the Matrix
    return os;
}

现在,当您执行std::cout << m;时,将调用您的函数,并且参数(std::ostream& os, ...)将引用std::cout