【问题标题】:Overloading << operator to print vector<MyClass>重载 << 运算符以打印 vector<MyClass>
【发布时间】:2020-10-22 13:11:55
【问题描述】:

我正在尝试重载


//position.h

#ifndef POSITION_H    
#define POSITION_H
#include <iostream>    // using IO functions
using namespace std;

class Position {
private:
    int row;
    int column;

public:
    friend ostream& operator<<(ostream& os, const Position& P);
    friend ostream& operator<<(ostream& os, const vector<Position>& VP);
};

#endif

//position.cpp
#include"Position.h"
#include <iostream>    // using IO functions
#include<vector>

ostream& operator<<(ostream& os, const Position& P)
{
    os << '(' << P.row << ',' << P.column << ')' << endl;
    return os;
}
    
ostream& operator<<(ostream& os, const vector<Position>& VP)
{
    Position placeholder;

    for (int i = 0; i != VP.size(); i++)
    {
        placeholder = VP.at(i);
        cout << placeholder << endl;
    }
    return os;
}

int main() 
{
    Position C1(2, 1);
    Position C2(3, 1);
    Position C3(4, 1);

    vector<Position> cans;
    cans.push_back(C1);
    cans.push_back(C2);
    cans.push_back(C3);

    cout << cans;

    system("pause");
}

【问题讨论】:

  • 你的向量运算符重载使用cout &lt;&lt; placeholder &lt;&lt; endl;,但它应该是os &lt;&lt; placeholder &lt;&lt; endl;

标签: c++ operator-overloading


【解决方案1】:

我确定 StackOverflow 上的某个地方有重复,但我找不到它。我对这个问题有点惊讶,因为我乍一看并没有真正看到一个关键问题。您是否遇到编译器错误或分段错误?

每次分配给Placeholder 时,都会复制一份。这根本没有必要:您可以直接访问索引处的元素。当您将索引限制为0size() 时,您不必担心越界,因此不要使用.at(i),如果您越界则会引发异常。只需使用VP[i]

也不是std::endl 刷新缓冲区,这很慢。使用'\n' 字符可以实现正常的输入/结束行。

最后,using namespace std; is considered bad practice

您有多种选择来处理向量的元素:

基于索引的for循环:

for (int i = 0; i != VP.size(); ++i) {
    os << VP[i] << '\n';
}

基于迭代器的for循环

for (auto it = cbegin(VP); it != cend(VP); ++it) {
    os << *it << '\n';
}

基于范围的for循环

for (auto const& el : VP) {
    os << el << '\n';
}

每个循环的算法

std::for_each(cbegin(VP), cend(VP),
   [](auto const& el) { os << el << '\n'; });

复制到ostream_iterator

std::copy(cbegin(VP), cend(VP),
    std::ostream_iterator<Position>(os, "\n"));

请注意,您也可以在此处编写 &lt;decltype(VP)::value&gt; 而不是 &lt;Position&gt; 以保持其通用性,但在这种情况下这可能有点矫枉过正。

最后两个具有等效的 C++20 范围:

std::ranges::for_each(VP,
   [](auto const& el) { os << el << '\n'; });
std::ranges::copy(VP,
   std::ostream_iterator<Position>(os, "\n"));

注意: friend ostream&amp; operator&lt;&lt;(ostream&amp; os, const vector&lt;Position&gt;&amp; VP); 不一定是Position 的朋友!它不需要访问私有成员。

【讨论】:

  • 我让它工作了!感谢您的详细反馈:) 我是新手,所以教会了我很多东西!
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多