![](/img/trans.png)
[英]C++: What is the correct cast for offseting to std::vector iterator?
[英]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)
一些底層指針提前的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 處得到一個指針。
鑒於這種算術,完全沒有乘法的意義。
並且是未定義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.