如何在C++中使用 <<= 运算符格式化链表

How to format the linked list using <<= operator in C++

本文关键字:lt 运算符 链表 格式化 C++      更新时间:2023-10-16

我遇到了一个问题,将此链接列表格式化为todo评论中所说的内容。我遇到的错误是:

In file included from main.cpp:3:0:
Graph.h: In member function ‘std::__cxx11::string Graph::formatList()’:
Graph.h:63:14: error: invalid operands of types ‘std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}’ and ‘LinkedListPtr {aka LinkedList<char>*}’ to binary ‘operator<<’
          str << adjList << endl;
          ~~~~^~~~~~~~~~
Graph.h:65:17: error: could not convert ‘str’ from ‘std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}’ to ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’
          return str;
                 ^~~

我的问题主要是如何在这种情况下使用<<=操作员。

我尝试创建一个字符串并将链接列表附加到它,我尝试使用str <<,如代码和cout <<中所示,但是该库不包括该类别。

string formatList(){
    /* TODO (2):
     *
     * Return a string representation of the list. 
     * 
     * Each list should be written on a separate line, using the LinkedList's
     * <<() function.
     * 
     * Sample:
     * [ B, D ]
     * [ A ]
     * [ D ]
     * [ A, C ]
     */
     string str;
     str << adjList << endl;
     return str;        
}// end displayList()

这是方法过载的<<=方法

virtual string toString() const{
    ostringstream oss;
    oss << "[ ";
    if ( !isEmpty() ) {
        nodeptr_t iter = head->next;
        while ( iter->next != tail ) {
            oss << iter->element << ", ";
            iter = iter->next;
        }
        oss << iter->element << " ";
    }
    oss << "]";
    return oss.str();
}// end toString()

我的期望是输出看起来像:

[ B, D ]    
[ A ]    
[ D ]    
[ A, C ]

显然不是错误。

谢谢。

您的toString()错误地循环遍布列表。它需要更像是这样的:

virtual string toString() const {
    ostringstream oss;
    oss << "[ ";
    if ( !isEmpty() ) {
        nodeptr_t iter = head;
        while ( iter != tail ) {
            oss << iter->element << ", ";
            iter = iter->next;
        }
        oss << iter->element << " ";
    }
    oss << "]";
    return oss.str();
}// end toString()

然后您可以这样实现operator<<

ostream& operator<<(ostream &os, const LinkedList &list) {
    os << list.toString();
    return os;
}

至于错误消息,它与您显示的代码不匹配。错误消息是指std::string*指针,但是在代码中,您显示的是使用std::string对象。但是,无论哪种方式,您的formatList()实施仍然错误,应该更像是这样:

string formatList() {
    /* TODO (2):
     *
     * Return a string representation of the list.
     *
     * Each list should be written on a separate line, using the LinkedList's
     * <<() function.
     *
     * Sample:
     * [ B, D ]
     * [ A ]
     * [ D ]
     * [ A, C ]
     */
    ostringstream oss;
    oss << *adjList << endl;
    return oss.str();
}// end displayList()