小编Kev*_*vin的帖子

视图迭代器在视图的生命周期之外是否有效?

假设我有一个将数据存储在地图中的自定义容器类:

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但是,无论是针对具体观点还是针对一般观点,标准是否保证了这一点?

c++ language-lawyer c++20 std-ranges

11
推荐指数
1
解决办法
510
查看次数

为什么浮点数不会溢出到无穷大

假设我们有以下代码:

float f = 999999999999*9999999999999999*999999999999; //a large number to make it overflow
Run Code Online (Sandbox Code Playgroud)

所以根据浮点规则,结果应该是无穷大: 在此处输入图片说明

但是我检查了结果的位表示,它不是无穷大,它是别的,怎么会?

c floating-point

2
推荐指数
1
解决办法
74
查看次数

标签 统计

c ×1

c++ ×1

c++20 ×1

floating-point ×1

language-lawyer ×1

std-ranges ×1