gpt4 book ai didi

C++,返回对 std::set 项的 const 和非 const 引用

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:56 28 4
gpt4 key购买 nike

类 A 包含两个重载方法 getItems();

typedef std::vector <int> TItems;

template <typename T>
class A
{
private:
T a;
TItems items;

public:
A(){}
A ( const T a_, const TItems & items_) : a(a_) , items (items_) {}
bool operator () ( const A <T> &aa ) {return a < aa.a;}
TItems const & getItems() const {return items}
TItems & getItems() {return items}
};

和A对象的集合

template <typename T>
struct TSet {typedef std::set <A <T> > Type;};

我想返回 const 引用/对 TItems 的引用,但只有第二种方法有效

int main ()
{
TSet <double> ::Type t;
TSet <double> ::Type::iterator it = t.begin();
t.insert (A <double>( 5, TItems(10,10)));

const TItems *items = &(it->getItems()); //OK
TItems *items = &(it->getItems()); //Error
}

Error 1 error C2440: 'initializing' : cannot convert from 'const TItems *' to 'TItems *

这是否是非常量引用允许修改 A 对象导致集合可能重新排列的原因?但是集合中的项目不是按 A.items 而是按 a.

有没有办法使用非常量引用修改 A.items?

最佳答案

Is it the reason that non-constant references enables to modify A objects causing a potential rearrangement od the set?

没错。 std::set 的元素(顺便说一句,std::map 的键)是不可变的,结构只会给你 const 限定的元素。所以你可以选择

  • 将您的结构更改为 std::map 并将您的 a 作为键,将 items 作为数据
  • 如果您完全确定不会通过操作items 来破坏顺序,您可以const_cast(或声明items mutable 如果适合你)。

关于C++,返回对 std::set 项的 const 和非 const 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8995240/

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