gpt4 book ai didi

c++ - 我们如何区分使用重载的 [] 运算符来获取和设置?

转载 作者:行者123 更新时间:2023-11-28 02:01:46 25 4
gpt4 key购买 nike

我正在编写作业,要求我实现自己的(基本) vector 类。一个不寻常的要求是,我们必须提供一个函数,该函数给出 vector 中所有元素的总和。此函数应缓存总和,以便在 vector 未更改的情况下可以在恒定时间内响应后续调用。

我遇到的问题是试图弄清楚何时它发生了变化。

#include <iostream>

class MyVector {
int* v;
int size;
int totalSum;
bool upToDate;
public:
MyVector(int size) : size{size}, totalSum{0}, upToDate{false} {
v = new int[size];
for(int i = 0; i < size; i++) {
v[i] = 0;
}
}

// Set - should only be called as an lvalue
int& operator[](unsigned int i) {
upToDate = false;
std::cerr << "Set\n";
return v[i];
}

// Get - should only be called as an rvalue
int operator[](unsigned int i) const {
std::cerr << "Get\n";
return v[i];
}

// Get sum of array -- result is cached for performance
int sum() {
if(!upToDate) {
upToDate = true;
totalSum = 0;
for(int i = 0; i < size; i++) {
totalSum += v[i];
}
}
return totalSum;
}
};

int main() {
MyVector mv(3);
mv[0] = 1;
mv[1] = 2;
mv[2] = 3;
std::cout << "Sum " << mv.sum() << "\n";

int first = mv[0];
std::cout << "First element is " << first << "\n";

std::cout << "Sum " << mv.sum() << "\n";
}

我提供了 [] 运算符的两个重载版本——一个用于获取,一个用于设置。每当调用运算符的设置版本时,我假设 vector 正在被更改。

# Output
Set
Set
Set
Sum 6
Set
First element is 1
Sum 6

但是,操作符的设置版本似乎总是被调用,即使它被用作右值也是如此。

如何正确重载 [] 运算符以区分其用于获取和设置?

最佳答案

您可以返回围绕该引用的薄代理包装器,而不是直接返回对存储的 int 的引用,它可以监视更改。在大多数情况下,编译器应该将其内联并优化掉(您可以尝试对其进行基准测试并进行比较)。

包装类:

class Item {
int &value;
MyVector &myVector;

public:
Item(int &value, MyVector &myVector) : value(value), myVector(myVector) {}

Item& operator=(int newvalue) {
std::cerr << "Set\n";
value = newvalue;
myVector.upToDate = false;
return *this;
}

// TODO: Reimplement also operators like +=, -=, etc
// You can use boost helpers for that.

operator int() const {
std::cerr << "Get\n";
return value;
}
};

MyVector 的变化:

class MyVector {
// ...

Item operator[](unsigned int i) {
return Item(v[i], *this);
}

const int operator[](unsigned int i) const {
std::cerr << "Const Get\n";
return v[i];
}

// ...
}

它可以以完全相同的方式使用:

int main() {
MyVector mv(3);
mv[0] = 1;
mv[1] = 2;
mv[2] = 3;
std::cout << "Sum " << mv.sum() << "\n";

int first = mv[0];
std::cout << "First element is " << first << "\n";

std::cout << "Sum " << mv.sum() << "\n";
}

关于c++ - 我们如何区分使用重载的 [] 运算符来获取和设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39184592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com