簡體   English   中英

如何迭代兩個向量的多態聯合?

[英]How can I iterate over the polymorphic union of two vectors?

我需要一種廉價的方法來迭代兩個向量的組合......

我有兩個我正在嘗試在物理模擬中使用的類, AB繼承自A

這個想法是:

std::vector<A*> items; // contains As and Bs
for (A* item : items) {
    item->doWorkA();
    if((B* itemB = dynamic_cast<B*>(a)) != nullptr)
        itemB->doWorkB();
    
    for(A* item2 : items) {
        if(item == item2)
            continue;

        item.doSomethingTo(item2);
    }
}

這是每秒運行任意次數,所以我相信運行時的動態轉換會非常昂貴。

我決定做的是為每種類型創建兩個單獨的向量,以便動態轉換只完成一次(而不是在每個任意時間步長),而是處理 B 向量上的所有B特定工作。 然后我將對兩個向量的並集做所有的A工作。

像這樣的東西:

std::vector<A*> aItems;
std::vector<B*> bItems;
for (B* itemB : bItems) {
    itemB->doWorkB();
}

for (A* item : aItems UNION bItems) {
    item.doWorkA();
    for(A* item2 : aItems UNION bItems) {
        if(item == item2)
            continue;

        item.doSomethingTo(item2);
    }
}

關於如何以有效的方式完成這個“聯合”的任何想法?

一個更簡潔的解決方案可能是編寫一些類,該類表示將基類指針作為值類型的連接向量范圍的視圖。 我認為 C++20 范圍庫中還沒有類似的東西,所以這可能需要一些額外的工作。

這是針對您的案例的解決方案:

auto for_a_and_b = [&](auto&& f){
    for(auto item : aItems)
        f(item);
    for(auto item : bItems)
        f(item)
};

for_a_and_b([&](A* item){
    item->doWorkA();
    for_a_and_b([&](A* item2){
        if(item != item2)
            item->doSomethingTo(item2);
    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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