gpt4 book ai didi

c++ - 返回右值或左值

转载 作者:行者123 更新时间:2023-11-30 04:51:20 24 4
gpt4 key购买 nike

我想定义s[i]返回 0如果s[0]从未分配并返回对 s[i] 的引用如果s[i]较早分配(以实现稀疏数组)。以下代码执行此操作,但最终会创建 s[i]由于 map 的语义,每当我尝试获取它的值时。

struct svec{
map<int,double> vals;
/*
double operator[](int index){
return (vals.count(index) > 0) ? vals[index] : 0 ;
else return 0;
}
*/
double &operator[](int index){
return vals[index];
}
};

int main(){
svec s;
s[0] = 10;
cout << s[1] << endl;
}

我希望注释代码用于解析表达式 s[1] .但是,如果我取消注释,则会出现错误。

最佳答案

您不能重载返回值,因此您必须坚持按引用或按值(或按指针等)返回。通过引用返回的问题是您必须引用存在于内存中的现有值。当值在 map 中时,这当然很好。如果不是,则必须创建默认值并将其存储在内存中。然后您必须确保正确删除它以免内存泄漏,同时还要确保用户没有持有对这些值的引用,因为它会引入意外行为。

此外,您还必须考虑用户可以更改您返回的值这一事实。如果您返回相同的默认值,则用户可以将其更改为另一个值。然后所有后续调用将返回对新值的引用。每次返回它时将默认值重置为 0 对于仍然保留对它的引用的所有用户来说也是意想不到的。

您可能可以稳定地解决此问题,但可能需要大量样板代码。在这种情况下,我建议将负担推给用户。

class SparseVector {
private:
std::unordered_map<int, double> elements;

public:
void set(int index, double value) {
elements[index] = value;
}

double& get(int index, double& optional) {
auto it = elements.find(index);
if (it != elements.end())
return it->second;
else
return optional;
}

double& get(int index) {
auto it = elements.find(index);
if (it != elements.end())
return it->second;
throw std::runtime_error(
"Couldn't find element at index " + std::to_string(index) +
"! Use get(int index, double& optional) if you don't want errors."
);
}
}

int main() {
double default_value = 0.0;
SparseVector vector;

std::cout << vector.get(0, default_value) << std::endl;
}

关于c++ - 返回右值或左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54839548/

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