如何在 C++ 中为数组重载 + 运算符?
How to overload + operator for arrays in C++?
对于学校的 C++ 练习,我需要重载 + 运算符以连接 2 个数组。我需要在通用 class.
中执行此操作
例如:
a1 = {1, 3, 4}
a2 = {2, 3, 5, 6}
=> a = {1, 3, 4, 2, 3, 5, 6}
我有这段代码,但它不起作用。
#include <iostream>
#include <array>
using namespace std;
template <class T>
T operator+(const T& a1, const T& a2)
{
T a;
for (typename T::size_type i = 0; i < a1.size() + a2.size; i++) {
if (i < a1.size()) {
a[i] = a1[i];
} else {
a[i] = a2[i];
}
}
return a;
}
int main()
{
array<int,3> a1 = { 1, 3, 4 };
array<int,4> a2 = { 2, 3, 5, 6 };
array<int,7> a3 = a1 + a2;
for (int i = 0; i < 5; i++)
cout << a1[i] << '+' << a2[i] << '=' << a3[i] << ' ';
cout << endl;
return 0;
}
此代码无效,这是我在控制台中收到的:
main.cpp:32:24: error: no match for ‘operator+’ (operand types are ‘std::array’ and ‘std::array’)
array<int,7> a3 = a1 + a2;
~~~^~~~
main.cpp:15:3: note: candidate: template T operator+(const T&, const T&)
T operator+(const T& a1, const T& a2)
我应该怎么做才能解决这个问题?还有一个问题,这段代码是否使用泛型 class?任何反馈将不胜感激!
T operator+(const T& a1, const T& a2)
以两个T
作为参数,returns一个T
。那不是你想要的。
这是使用 operator+
:
连接两个数组的方法
#include <iostream>
#include <array>
template <typename T,size_t M,size_t N>
std::array<T,M+N> operator+(const std::array<T,M>& a1, const std::array<T,N>& a2) {
std::array<T,M+N> a;
for (size_t i = 0; i < M; ++i) {
a[i] = a1[i];
}
for (size_t i = 0; i < N; ++i) {
a[i + M] = a2[i];
}
return a;
}
int main() {
std::array<int,3> a1 = { 1, 3, 4 };
std::array<int,4> a2 = { 2, 3, 5, 6 };
std::array<int,7> a3 = a1 + a2;
for (const auto& e : a3){
std::cout << e << " ";
}
std::cout << "\n";
}
您的代码以某种方式混合了元素加法和连接。在 operator+
的实现中有一些拼写错误(例如 size
而不是 size()
和越界访问 a2
)。
And another question, does this code use generic class?
没有。您的 operator+
(以及上面的)是一项免费功能。 std::array
是通用容器,std::array<int,N>
是 class。
对于学校的 C++ 练习,我需要重载 + 运算符以连接 2 个数组。我需要在通用 class.
中执行此操作例如:
a1 = {1, 3, 4}
a2 = {2, 3, 5, 6}
=> a = {1, 3, 4, 2, 3, 5, 6}
我有这段代码,但它不起作用。
#include <iostream>
#include <array>
using namespace std;
template <class T>
T operator+(const T& a1, const T& a2)
{
T a;
for (typename T::size_type i = 0; i < a1.size() + a2.size; i++) {
if (i < a1.size()) {
a[i] = a1[i];
} else {
a[i] = a2[i];
}
}
return a;
}
int main()
{
array<int,3> a1 = { 1, 3, 4 };
array<int,4> a2 = { 2, 3, 5, 6 };
array<int,7> a3 = a1 + a2;
for (int i = 0; i < 5; i++)
cout << a1[i] << '+' << a2[i] << '=' << a3[i] << ' ';
cout << endl;
return 0;
}
此代码无效,这是我在控制台中收到的:
main.cpp:32:24: error: no match for ‘operator+’ (operand types are ‘std::array’ and ‘std::array’)
array<int,7> a3 = a1 + a2;
~~~^~~~
main.cpp:15:3: note: candidate: template T operator+(const T&, const T&)
T operator+(const T& a1, const T& a2)
我应该怎么做才能解决这个问题?还有一个问题,这段代码是否使用泛型 class?任何反馈将不胜感激!
T operator+(const T& a1, const T& a2)
以两个T
作为参数,returns一个T
。那不是你想要的。
这是使用 operator+
:
#include <iostream>
#include <array>
template <typename T,size_t M,size_t N>
std::array<T,M+N> operator+(const std::array<T,M>& a1, const std::array<T,N>& a2) {
std::array<T,M+N> a;
for (size_t i = 0; i < M; ++i) {
a[i] = a1[i];
}
for (size_t i = 0; i < N; ++i) {
a[i + M] = a2[i];
}
return a;
}
int main() {
std::array<int,3> a1 = { 1, 3, 4 };
std::array<int,4> a2 = { 2, 3, 5, 6 };
std::array<int,7> a3 = a1 + a2;
for (const auto& e : a3){
std::cout << e << " ";
}
std::cout << "\n";
}
您的代码以某种方式混合了元素加法和连接。在 operator+
的实现中有一些拼写错误(例如 size
而不是 size()
和越界访问 a2
)。
And another question, does this code use generic class?
没有。您的 operator+
(以及上面的)是一项免费功能。 std::array
是通用容器,std::array<int,N>
是 class。