STL算法在第二个容器上重复擦除操作?

STL algorithm to repeat an erase operation on a second container?

生活给了我以下对象:

和以下约束:

v1 中删除两个迭代器指向的范围是一个简单的单行,但是我如何 也从 v2 中删除相同的范围?

我可以轻松解决这个问题,例如通过混合使用 std::distance/advance 构建 v2 迭代器,但我想知道 STL 是否提供了一些机制为了这。也许是像擦除-删除习语加上转换操作?这似乎超出了我的STL-fu...

当你有一个迭代器时,你可以通过 std::distancebegin() 获取索引。

当你有索引时,你可以通过begin() + index获得迭代器。

这基本上就是您在第二个向量中获得相同范围的指数所需的全部。

顺便说一句,迭代器是用来抽象索引的。当您需要索引时,请使用索引。对于 erase 那将是

size_t start = 1;
size_t end = 42;
std::erase( v1.begin() + start, v1.begin() + end );
std::erase( v2.begin() + start, v2.begin() + end );

I can easily solve this for instance by building v2 iterators using a mix of std::distance/advance, but I was wondering if the STL provides some machinery for this. Something like the erase-remove idiom coupled with a transform operation, maybe? It seems beyond my STL-fu...

写完答案才看到编辑。问题是 std::distance / std::advance 在迭代器和索引之间切换的机制。

考虑一下,迭代器通常用于可以迭代的事物。您甚至不需要容器来迭代。例如,您可以编写一个迭代器类型来迭代整数。这种迭代器类型可以这样使用:

std::vector<std::string> x(100);
auto begin = int_iterator(0);
auto end   = int_iterator(100);
for ( ; begin != end; ++begin) std::cout << x[ *begin ];

这不是 C 主义。这个例子可能不是最好的,但 int_iterator 本身与迭代器的一般概念不相上下。 通常迭代器不知道底层容器(如果有的话)。几乎没有例外(例如 insert_iterator)。在 erase 的情况下,您当然需要传递引用相应容器中元素的迭代器。