C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?

In C++ how does one multiply an iterator of a vector which contains std::variant elements? Doing a cast of the iterator type?

本文关键字:迭代器 转换 类型 执行 向量 元素 何乘 包含 variant std C++      更新时间:2023-10-16
#include <iostream>
#include <vector>
#include <string>
#include <variant>
struct S1 { int a {}; };
struct S2 { std::string b {}; };
using Struct_variant = std::variant< S1, S2 >;
int main() {
std::vector<Struct_variant> struct_vector { S1 {1}, S2 {"hello"}, S1 {3}};
size_t index_to_erase {1};  // NOTE: assume we only know the index, *not* the iterator.
auto variant_itr = struct_vector.begin();
// following line requires either a std::vist, or an "if std::holds_alternative" to handle types.
variant_itr =  struct_vector.begin() * index_to_erase;
// for (int i = 0; i != index_to_erase; i++) variant_itr++;  // works
struct_vector.erase(variant_itr);
std::cout << struct_vector.size() << std::endl;
}

我不完全明白为什么增量有效,而乘法不起作用。 什么是static_cast<>((?

任何帮助将不胜感激。

乘以迭代器或指针没有定义或意义。"空间中的点"不能"乘法",无论是在编程中还是在现实生活中。只能将距离/跨度/数量相乘。

看起来您只是希望将迭代器推进index_to_erase空格。这是补充

const auto variant_itr = struct_vector.begin() + index_to_erase;

就是这样!

如果容器的迭代器确实像指向数据的指针一样简单,则将其转换为index_to_erase*sizeof(Struct_variant)的某个基础指针前进的逻辑是为您完成的。

请注意,这仅适用于随机访问迭代器;更一般地说,您可以使用std::advancestd::next,但是如果您发现自己需要它,那么您的解决方案可能效率不高。

我不完全明白为什么增量有效,而乘法不起作用。

简短回答:在迭代器上,定义了增量(++(运算符,没有乘法。

长答案

迭代器上的运算不是代数,其中begin()位置具有1值。

迭代器是指针的演变,指针是一个表示内存中位置的数字,在第一次近似(也是第二次近似,带有std::vectors(中,您可以将迭代器推理为指针。

假设begin()返回 1000,并且Struct_variant大小为10(完成的发明数字(。

使用variant_itr++,您将指针(迭代器(值递增,即(指针算术(您不会得到 1001(1000 加 1(,而是 1010,这是以下Struct_variant的位置。

如果应用增量 5 次(例如(,则会在位置1050而不是 1005 中获得指针。

给定这种类型的算术,完全没有乘法的意思。

并且未定义。