STL算法在第二个容器上重复擦除操作?
STL algorithm to repeat an erase operation on a second container?
生活给了我以下对象:
std::vector<T1> v1;
std::vector<T2> v2;
typename std::vector<T1>::iterator it_first;
typename std::vector<T1>::iterator it_last;
和以下约束:
v1.size() == v2.size() > 0
v1.begin() <= it_first <= it_last <= v1.end()
从 v1
中删除两个迭代器指向的范围是一个简单的单行,但是我如何 也从 v2
中删除相同的范围?
我可以轻松解决这个问题,例如通过混合使用 std::distance/advance
构建 v2
迭代器,但我想知道 STL 是否提供了一些机制为了这。也许是像擦除-删除习语加上转换操作?这似乎超出了我的STL-fu...
当你有一个迭代器时,你可以通过 std::distance
到 begin()
获取索引。
当你有索引时,你可以通过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
的情况下,您当然需要传递引用相应容器中元素的迭代器。
生活给了我以下对象:
std::vector<T1> v1;
std::vector<T2> v2;
typename std::vector<T1>::iterator it_first;
typename std::vector<T1>::iterator it_last;
和以下约束:
v1.size() == v2.size() > 0
v1.begin() <= it_first <= it_last <= v1.end()
从 v1
中删除两个迭代器指向的范围是一个简单的单行,但是我如何 也从 v2
中删除相同的范围?
我可以轻松解决这个问题,例如通过混合使用 std::distance/advance
构建 v2
迭代器,但我想知道 STL 是否提供了一些机制为了这。也许是像擦除-删除习语加上转换操作?这似乎超出了我的STL-fu...
当你有一个迭代器时,你可以通过 std::distance
到 begin()
获取索引。
当你有索引时,你可以通过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
的情况下,您当然需要传递引用相应容器中元素的迭代器。