flat_map icon indicating copy to clipboard operation
flat_map copied to clipboard

tied_sequenceのアロケータについて

Open sukeya opened this issue 1 year ago • 6 comments

こんにちは。

zip_allocatorという、zip_iteratorのアロケータ版を作ったのですが、要りますか?

sukeya avatar Feb 25 '24 13:02 sukeya

上げたので良ければcherry-pickなどで持っていってください。 https://github.com/sukeya/flat_map/blob/dev/flat_map/__memory.hpp

sukeya avatar Feb 25 '24 14:02 sukeya

すいません、まず説明をしてください。なぜこれが必要なのか、どういった問題を解決するのか、こういうアルゴリズムと組み合わせるとうまく行かないのを解決する、とか。なにかブログエントリでもいいんですが、そういった説明が無いならば特に今のところは需要は無いです。

Flast avatar Feb 26 '24 05:02 Flast

無視されるだろうと思っていましたので、説明しませんでした。すみません。

現在困っている訳ではないのですが、私の書いているプログラムでtied_sequenceを入れ子にして使っています。現在の実装では、各sequenceにそれぞれ1つのアロケータを渡しているので内側のtied_sequenceに意味のあるアロケータを渡すことができません。そのため、複数のアロケータをまとめたアロケータを作りました。このアロケータは各操作を内部の各アロケータに依頼するだけです。 tied_sequenceではアロケータのタプル以上の意味はないですが、これにより入れ子の内側のtied_sequenceにもアロケータを渡すことができ、アロケータとして使うことも可能です。

sukeya avatar Feb 26 '24 05:02 sukeya

私の書いているプログラムでtied_sequenceを入れ子にして使っています。現在の実装では、各sequenceにそれぞれ1つのアロケータを渡しているので内側のtied_sequenceに意味のあるアロケータを渡すことができません。

これにより入れ子の内側のtied_sequenceにもアロケータを渡すことができ、アロケータとして使うことも可能です。

ちょっと意図が汲み取れているかわからないですが、

using inner = tied_sequence<vector<T, AllocA>, vector<U, AllocB>>;
tied_sequence<inner, vector<V, AllocC>> nested{tuple{AllocA{}, AllocB{}}, AllocC{}};

のようなことをして、内側のtied_sequenceが持つコンテナへのアロケータを渡したいということでしょうか。

あんまり tied_sequence を別の用途で使うことを想定していなかったのでできないのはそうですが、まぁあまり変なことにはなら無さそうなので実装するのは良いと思います。

ただ、tied_sequence がアロケータを持つのはちょっと変なので、もっと簡便な実装でctorでのみforwardingできるような仕組みにするのがいい気がします。

Flast avatar Feb 27 '24 10:02 Flast

その認識であってます。

確かにアロケータにする必要はないのですね。その方向で考えると、tied_sequence

using allocator_type = std::tuple<typename Sequences::allocator_type const&...>;

template <std::size_t... N>
constexpr tied_sequence(std::index_sequence<N...>, allocator_type const& alloc)
  : _seq{Sequences(std::get<N>(alloc)...} { }

tied_sequence(allocator_type const& alloc) : tied_sequence{std::index_sequence_for<Sequences...>{}, alloc} { }

を追加するのはどうでしょうか?

sukeya avatar Feb 28 '24 01:02 sukeya

allocator_typeの意味論的要件にはあってませんが...

sukeya avatar Feb 28 '24 02:02 sukeya

ctorでアロケータをfwdできる仕組みを作ってみました

Flast avatar Jun 06 '24 05:06 Flast

ありがとうございます! flat_map::forward_allocatorで複数のアロケータをまとめて、コンストラクタにアロケータとして渡すんですね。 試しに使ってみようと思います。

sukeya avatar Jun 09 '24 06:06 sukeya