Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;范围适配器/视图和迭代器无效规则_C++_Range_C++20 - Fatal编程技术网

C++ C++;范围适配器/视图和迭代器无效规则

C++ C++;范围适配器/视图和迭代器无效规则,c++,range,c++20,C++,Range,C++20,在修改基础容器时,我没有找到任何特定于范围/范围适配器/范围视图的无效规则 直觉表明,它与指针/迭代器失效规则完全相同——这些规则是在中指定的 当前的集装箱失效措辞如下: “…使引用的所有引用、指针和迭代器无效 到序列中的元素,以及过去的结束 迭代器。” 这就提出了一个问题:所有范围是否都必须“引用序列的元素”,或者它们是否可以通过容器的接口访问元素? 在我看来,大多数范围适配器已经访问了一个序列,而没有直接引用该序列的元素(即,惰性视图只是构建迭代器适配器) 可以说,重要的是视图金字塔底部的基

在修改基础容器时,我没有找到任何特定于范围/范围适配器/范围视图的无效规则

直觉表明,它与指针/迭代器失效规则完全相同——这些规则是在中指定的

当前的集装箱失效措辞如下:

“…使引用的所有引用、指针和迭代器无效 到序列中的元素,以及过去的结束 迭代器。”

这就提出了一个问题:所有范围是否都必须“引用序列的元素”,或者它们是否可以通过容器的接口访问元素?

在我看来,大多数范围适配器已经访问了一个序列,而没有直接引用该序列的元素(即,惰性视图只是构建迭代器适配器)

可以说,重要的是视图金字塔底部的基本范围


我们都在某一点上了解到,在迭代同一个向量时不能执行
std::vector::push_
,因为内存可能会移动并使迭代无效。但是,我们还了解到,只要小心正确检查
size()
边界,就可以使用带有push\u back的
std::vector::operator[]
访问

在我看来,同样的规则也适用于范围/适配器/视图

那么:有没有可能强制一些等价于
std::ranges::views的内容​::​所有的
(或者,可能是
查看
)在一个随机访问容器上使用数组索引(或者一些等效的间接/惰性元素访问),而不是直接使用迭代


允许这样做的东西:

std::vector<People> people = ...;
for (auto& person : std::ranges::views::lazy_all(people)) { // or ranges::lazy_take_view(people, people.size())
  if (person.has_new_child()) {
    people.push_back(person.get_new_child());
  }
}
std::vector people=。。。;
for(auto&person:std::ranges::views::lazy_all(people)){//或ranges::lazy_take_view(people,people.size())
if(person.has_new_child()){
人。推回(人。得到新的孩子();
}
}

“是否可以强制某些等价于std::ranges::views​::​“你是在问是否存在这样的东西,还是可以写这样的东西?”?此外,这个问题与“所有范围都必须”指序列的元素有什么关系?“这似乎是两个独立的问题。这有严重的问题。如果你在前面插入一个元素,所有的索引都会被抵消,但是范围无法在那里调整自己。@Nicolas我在问这两个问题——它是否存在于当前范围建议中,如果不存在,我是否可以制作一个与范围库的其他部分兼容的元素。我假设分别是“否”和“是”,但只是询问。@Nicolas“所有范围都必须”引用序列中的元素吗?”“我认为这相当于询问范围适配器/视图(如视图::all)是否必须直接引用元素(因此无效)。在我看来,看看规范草案,只要可能,实现就必须在容器上使用直接迭代器(这似乎是合理的),但我想知道是否可以找到一些范围适配器来“强制”是间接的。@GuillaumeRacicot在迭代时插入到前面将使任何现有的迭代器对或范围方法无效。当然,使用数组索引并不能解决所有的逻辑错误。也许您是对的,我提供的建议代码太容易出现逻辑错误,因为它隐藏了太多的内容——但我只是问一个技术问题,关于目前可能出现的情况,而不是提出一个具体的建议。