假设我有一个将数据存储在地图中的自定义容器类:
class Container
{
public:
void add(int key, std::string value) { _data.emplace(key, std::move(value)); }
private:
std::map<int, std::string> _data;
};
Run Code Online (Sandbox Code Playgroud)
我想提供一个接口来访问地图的值(而不是键)。范围库提供了std::views::values地图值的范围:
auto values() { return std::views::values(_data); }
Run Code Online (Sandbox Code Playgroud)
用法:
Container c;
c.add(1, "a");
c.add(3, "b");
c.add(2, "c");
for (auto &value : c.values())
std::cout << value << " "; // Prints "a c b"
Run Code Online (Sandbox Code Playgroud)
但由于我想将我的类视为一个容器,所以我想要拥有begin()和end()迭代器。我可以这样做吗?
auto begin() { return std::ranges::begin(values()); }
auto end() { return std::ranges::end(values()); }
Run Code Online (Sandbox Code Playgroud)
在这里,我调用values()以获取映射值的范围,并获取到范围开头的迭代器(或哨兵结束迭代器)。但范围本身超出范围并被破坏。迭代器本身仍然有效吗?
从这个例子来看,迭代器似乎是有效的。std::views:values但是,无论是针对具体观点还是针对一般观点,标准是否保证了这一点?
假设我们有以下代码:
float f = 999999999999*9999999999999999*999999999999; //a large number to make it overflow
Run Code Online (Sandbox Code Playgroud)
但是我检查了结果的位表示,它不是无穷大,它是别的,怎么会?