2017-10-16 11 views
0

tailqと同等の標準C++クラスがあるのだろうかと思います。私はtailqのc実装を使うことができますが、それはたくさんのマクロを使い、やや醜いです。tailqとC++の同等語

基本的には、クラスがあり、各インスタンスは複数のリストの一部でなければなりません。余分なmalloc /メモリの逆参照を避けるために、私はnextprevポインタをクラスそのものの中に格納したいと思います。 C++にはこれを行うための巧妙な方法がありますか?それとも、<sys/queue.h>を使用するほうが良いですか?

+5

'tailq'何? – Ron

+0

次の/前のポインタのベクトルを持つ必要があるでしょうか?クラスと2つのベクトルをカプセル化するシンプルな構造体を作ることはできますか?あなたが描いていることは私には分かりません。多少の文脈が有益かもしれません。 – AlexG

+0

オブジェクトを複数のリンクされたリストのメンバーにして、独自のリンクを格納する方法を計画していますか?各リストに別々のリンクを保存するためにそれを覚えていますか? –

答えて

1

C++shared_ptrのコンテナがあります。それは重要ではありません。std::listまたはstd::vectorまたは任意のコンテナにすることができます。出力された

#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
shared_ptrであなたが個別に割り当てられた各要素を持っているので、私はので、私は std::vector<std::shared_ptr<X>>

例のために行くだろうstd::listを使用するには、何らかの正当な理由が表示されません

クラスのポインタを内部に格納することは問題ありません。次のコードはうまくコンパイル:

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

これは、あなたがオブジェクト内の複数のリストのためのポインタを持つことができるようになります:

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

はい、しかし、リストを歩くためには、元のクラスポインタ( 'next = current-> next-offsetof(current、next)'を得るために 'offsetof() )、これはC++でいつも期待どおりに動作するかどうか疑いがあります。 (クラス内に複数のリストがあることに注意してください)。 – user2766918

+0

@ user2766918次のポインタと前のポインタのベクトルを持つことができます。それぞれのポインタは異なるリストに対応しています。これを反映する編集済みの回答 –