我想知道是否有一個標準的C++類相當於一個tailq。我可以使用tailq的c實現,但它使用了很多宏,並且有點難看。C++相當於tailq
基本上,我有一個類,其中每個實例必須是多個列表的一部分。爲了避免額外的malloc /內存解除引用,我想在類中存儲next
和prev
指針。 C++有這樣一個聰明的方法,還是我使用<sys/queue.h>
更好?
我想知道是否有一個標準的C++類相當於一個tailq。我可以使用tailq的c實現,但它使用了很多宏,並且有點難看。C++相當於tailq
基本上,我有一個類,其中每個實例必須是多個列表的一部分。爲了避免額外的malloc /內存解除引用,我想在類中存儲next
和prev
指針。 C++有這樣一個聰明的方法,還是我使用<sys/queue.h>
更好?
在C++
我會有容器shared_ptr
。沒關係,它可以是std::list
或std::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
將類的指針存儲在其內部沒有任何問題。下面的代碼編譯就好:
class A
{
A* next;
A* prev;
};
這將讓你有對象內部的多個列表指針:
class A
{
std::vector<A*> next;
std::vector<A*> prev;
};
是的,但是爲了遍歷列表,您必須使用'offsetof()'來獲取原始類指針('next = current-> next - offsetof(current,next)'' ),我很懷疑C++中是否會像預期的那樣工作。 (請記住,班級中有多個列表)。 – user2766918
@ user2766918您可以擁有next和prev指針的向量,每個指針對應不同的列表。編輯答案反映了這一點 –
什麼是'tailq'? – Ron
所以你需要有一個next/prev指針的向量是這樣嗎?你可以製作一個簡單的結構來封裝你的類和兩個向量,不是嗎?你所描述的內容對我而言並不明顯。也許更多的背景可能是有價值的。 – AlexG
您如何計劃一個對象成爲多個鏈接列表的成員並存儲其自己的鏈接?你是否會爲每個列表存儲一對單獨的鏈接? –