我试图使<<操作符重载,以打印包含位置(向量)类型元素的向量。我设法重载了<<操作符的类型位置,但我不知道如何对向量进行重载。你能帮上忙吗?
//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");
}
发布于 2020-10-22 05:21:59
我确信在某个地方StackOverflow上有一个副本,但我找不到。我对这个问题感到有点惊讶,因为我并没有一见钟情地看到一个关键问题。您收到编译器错误或分段错误了吗?
每次分配给Placeholder
时,都要复制一份。这根本没有必要:您可以直接访问索引处的元素。当您将索引限制为0
为size()
时,您不必担心超出界限,所以不要使用.at(i)
,如果超出界限,就会抛出异常。只需使用VP[i]
。
也不是说std::endl
刷新缓冲区,这是缓慢的。使用'\n'
字符可以实现正常的输入/结束行。
终于,被认为是不好的做法。
您有多个处理向量元素的选项:
基于索引的for循环:
for (int i = 0; i != VP.size(); ++i) {
os << VP[i] << '\n';
}
基于迭代器的循环
for (auto it = cbegin(VP); it != cend(VP); ++it) {
os << *it << '\n';
}
基于范围的循环
for (auto const& el : VP) {
os << el << '\n';
}
(每个)循环的算法
std::for_each(cbegin(VP), cend(VP),
[](auto const& el) { os << el << '\n'; });
复制到迭代器
std::copy(cbegin(VP), cend(VP),
std::ostream_iterator<Position>(os, "\n"));
请注意,在这里您还可以编写<decltype(VP)::value>
而不是<Position>
,以保持它的通用性,但在这种情况下,这可能会导致过度使用。
最后两个值与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& operator<<(ostream& os, const vector<Position>& VP);
不必是Position
的朋友!它不需要访问私人成员。
https://stackoverflow.com/questions/64483031
复制相似问题