gpt4 book ai didi

c++ - map的反向迭代,通过getter访问/无拷贝

转载 作者:行者123 更新时间:2023-11-30 05:28:55 25 4
gpt4 key购买 nike

我有一个读取/解析文件并将键值对存储在映射中的类。

typedef std::map<std::string, const int> Data;
typedef std::map<std::string, const int>::reverse_iterator DataItReverse;

现在我有一个 getter 可以从“解析器”类 inline Data getData() const {return _data;}

一切都很好,直到我想反向迭代有问题的 map 。

for(DataItReverse it_reverse = _parser->getData().rbegin();
it_reverse != _parser->getData().rend();
++it_reverse)
{
std::cout << it_reverse->first << std::endl;
}

上面的代码以正常顺序迭代(不是反向),当我将数据复制到临时变量时一切正常:

Data tmpData = _parser->getData();
for(...)

我想避免复制数据,因为它会是一张大 map 。


请注意 _parser 是一个指针,因此其中的数据不会被多次复制

最佳答案

实际上,通过迭代一个在您使用迭代器时不存在的临时对象,您会得到未定义的行为。

制作拷贝(如您正确确定的解决方案),或更改“getter”以返回引用。

inline const Data & getData() const { return _data; }

这实际上是标准做法。您通常不会按值从 getter 返回复杂结构,除非它是派生数据(未存储在类中)或可能在调用后发生更改(一个示例是多线程环境,您需要获取锁以获取当前状态):

然后您将不得不使用常量迭代器。我倾向于使用 auto 关键字来避免循环中的困惑:

for( auto it = _parser->getData().rbegin(); it != _parser->getData().rend(); ++it )

要使用非常量迭代器,您需要制作一个拷贝,或者还提供一个非常量“getter”。通常不推荐这样做,但也许适合您的目的:

inline Data & getData() { return _data; }

关于c++ - map的反向迭代,通过getter访问/无拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610383/

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