簡體   English   中英

在 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)一些底層指針提前的index_to_erase*sizeof(Struct_variant)已經為您完成,如果您的容器的迭代器確實像指向數據的指針一樣簡單。

請注意,這僅適用於隨機訪問迭代器; 更一般地說,您可以使用std::advancestd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM