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?
#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::advance
或std::next
,但是如果您发现自己需要它,那么您的解决方案可能效率不高。
我不完全明白为什么增量有效,而乘法不起作用。
简短回答:在迭代器上,定义了增量(++
(运算符,没有乘法。
长答案
迭代器上的运算不是代数,其中begin()
位置具有1
值。
迭代器是指针的演变,指针是一个表示内存中位置的数字,在第一次近似(也是第二次近似,带有std::vector
s(中,您可以将迭代器推理为指针。
假设begin()
返回 1000,并且Struct_variant
大小为10
(完成的发明数字(。
使用variant_itr++
,您将指针(迭代器(值递增,即(指针算术(您不会得到 1001(1000 加 1(,而是 1010,这是以下Struct_variant
的位置。
如果应用增量 5 次(例如(,则会在位置1050
而不是 1005 中获得指针。
给定这种类型的算术,完全没有乘法的意思。
并且未定义。
相关文章:
- 是否应避免从非常量迭代器转换为常量迭代器?
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- C++ 如何为自己的迭代器类从迭代器转换为const_iterator?
- C++将向量迭代器转换为索引
- 从迭代器转换为变量的类型.(C++11 模板)
- 提高迭代器转换const_iterator
- 将字符串::迭代器转换为标准::字符串
- C++将迭代器转换为指针(并将 end() 转换为 nullptr)
- C++Spirit Boost:将输入迭代器转换为前向迭代器
- 将迭代器转换为指针,尤其是在end()处
- Deque索引迭代器转换
- 将多映射迭代器转换为随机访问迭代器
- 将迭代器转换为标量索引
- 无法将uint8_t矢量迭代器转换为常量 uint8_t *
- 如何将列表 STL 的迭代器转换为实例 (C++)
- 适配器,用于将任何迭代器转换为随机访问迭代器
- 将取消引用字符迭代器转换为 int C++
- 如何在C++中将矢量迭代器转换为 int
- c++入门第3章迭代器转换错误
- 将rend迭代器转换为end iteterator