2017-10-16 554 views
0

我想知道是否有一個標準的C++類相當於一個tailq。我可以使用tailq的c實現,但它使用了很多宏,並且有點難看。C++相當於tailq

基本上,我有一個類,其中每個實例必須是多個列表的一部分。爲了避免額外的malloc /內存解除引用,我想在類中存儲nextprev指針。 C++有這樣一個聰明的方法,還是我使用<sys/queue.h>更好?

+5

什麼是'tailq'? – Ron

+0

所以你需要有一個next/prev指針的向量是這樣嗎?你可以製作一個簡單的結構來封裝你的類和兩個向量,不是嗎?你所描述的內容對我而言並不明顯。也許更多的背景可能是有價值的。 – AlexG

+0

您如何計劃一個對象成爲多個鏈接列表的成員並存儲其自己的鏈接?你是否會爲每個列表存儲一對單獨的鏈接? –

回答

1

C++我會有容器shared_ptr。沒關係,它可以是std::liststd::vector或任何容器。因爲shared_ptr你的每個元素單獨分配,我看不出有什麼好的理由來使用std::list,所以我會去std::vector<std::shared_ptr<X>>

例子:

#include <memory> 
#include <vector> 
#include <iostream> 

struct X { int a = 0; X() = default; X(int p) { a = p; } }; 

auto operator<<(std::ostream& os, X x) -> std::ostream& 
{ 
    os << x.a; 
    return os; 
} 

int main() 
{ 
    auto x1 = std::make_shared<X>(24); 
    auto x2 = std::make_shared<X>(11); 
    auto x3 = std::make_shared<X>(1024); 
    auto x4 = std::make_shared<X>(5); 

    std::vector<std::shared_ptr<X>> v1 = {x1, x2, x3, x4}; 
    std::vector<std::shared_ptr<X>> v2 = {x3, x1, x4};  

    // modify an object and observe the change in both lists 
    x1->a = -24; 

    for (const auto& e : v1) 
     std::cout << *e << ' '; 
    std::cout << '\n'; 

    for (const auto& e : v2) 
     std::cout << *e << ' '; 
    std::cout << '\n'; 
} 

輸出爲:

-24 11 1024 5 
1024 -24 5 
0

將類的指針存儲在其內部沒有任何問題。下面的代碼編譯就好:

class A 
{ 
    A* next; 
    A* prev; 
}; 

這將讓你有對象內部的多個列表指針:

class A 
{ 
    std::vector<A*> next; 
    std::vector<A*> prev; 
}; 
+0

是的,但是爲了遍歷列表,您必須使用'offsetof()'來獲取原始類指針('next = current-> next - offsetof(current,next)'' ),我很懷疑C++中是否會像預期的那樣工作。 (請記住,班級中有多個列表)。 – user2766918

+0

@ user2766918您可以擁有next和prev指針的向量,每個指針對應不同的列表。編輯答案反映了這一點 –