映射的反向迭代,由getter/without copy访问
Reverse iterating of map, which is accessed by getter / without copy
我有一个类,它读取/解析文件并在映射中存储键值对。
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;}
中获取数据
一切都很好,直到我想通过有问题的映射进行反向迭代。
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(...)
我想避免复制数据,因为它将是一张大地图。
请注意,_parser
是一个指针,因此它内部的数据不会被多次复制
通过迭代到使用迭代器时不存在的临时对象,实际上得到了未定义的行为。
制作一个副本(因为您正确地将其标识为解决方案),或者更改"getter"以返回引用。
inline const Data & getData() const { return _data; }
这实际上是标准做法。您通常不会从getter按值返回复杂的结构,除非它是派生数据(不存储在类中),或者可能在调用后发生更改(例如,多线程环境中需要获取锁才能获得当前状态):
然后,您将不得不使用const迭代器。我倾向于使用auto
关键字来避免循环中的混乱:
for( auto it = _parser->getData().rbegin(); it != _parser->getData().rend(); ++it )
要使用非常量迭代器,您需要制作一个副本,或者还提供一个非常量"getter"。这通常不推荐,但可能适合您的目的:
inline Data & getData() { return _data; }
相关文章:
- 如何通过 getter 函数删除矢量的元素?
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- dynamic_cast without RTTI
- 如何为 C 型字符串数组编写 getter 和 setter?
- C++ Setter/Getter,cout 工作,printf 失败
- Qt - QQuickWidget setSource without freezing UI
- 指向成员函数的模板指针 - getter
- 使用 getter 访问成员变量C++
- 如何在节点插件中创建 getter?
- "in-situ without memory allocation" 字符串的愚蠢实现意味着什么?
- 即使有 0 个错误,Getter 似乎也会使程序崩溃
- 将值推送到 getter 函数调用的列表中时出现问题
- 为什么我的编译器在调用 const getter 函数时抛出"转换丢失(const)限定符"错误?
- 私有变量无法正常工作的C++getter方法(只有Java经验)
- 如何使用 getter 功能push_back列表?
- 常量和非常量 getter 具有相同的名称
- C++线程"Call to non-static member function without an object argument"
- 不一定获得成员价值的 getter 方法?
- 在 c++ 中使用 getter 作为unordered_map会创建大小为 8 的无效读取
- 映射的反向迭代,由getter/without copy访问