flat_map
flat_map copied to clipboard
tied_sequenceのアロケータについて
こんにちは。
zip_allocatorという、zip_iteratorのアロケータ版を作ったのですが、要りますか?
上げたので良ければcherry-pickなどで持っていってください。 https://github.com/sukeya/flat_map/blob/dev/flat_map/__memory.hpp
すいません、まず説明をしてください。なぜこれが必要なのか、どういった問題を解決するのか、こういうアルゴリズムと組み合わせるとうまく行かないのを解決する、とか。なにかブログエントリでもいいんですが、そういった説明が無いならば特に今のところは需要は無いです。
無視されるだろうと思っていましたので、説明しませんでした。すみません。
現在困っている訳ではないのですが、私の書いているプログラムでtied_sequenceを入れ子にして使っています。現在の実装では、各sequenceにそれぞれ1つのアロケータを渡しているので内側のtied_sequenceに意味のあるアロケータを渡すことができません。そのため、複数のアロケータをまとめたアロケータを作りました。このアロケータは各操作を内部の各アロケータに依頼するだけです。 tied_sequenceではアロケータのタプル以上の意味はないですが、これにより入れ子の内側のtied_sequenceにもアロケータを渡すことができ、アロケータとして使うことも可能です。
私の書いているプログラムで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できるような仕組みにするのがいい気がします。
その認識であってます。
確かにアロケータにする必要はないのですね。その方向で考えると、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} { }
を追加するのはどうでしょうか?
allocator_type
の意味論的要件にはあってませんが...
ctorでアロケータをfwdできる仕組みを作ってみました
ありがとうございます!
flat_map::forward_allocator
で複数のアロケータをまとめて、コンストラクタにアロケータとして渡すんですね。
試しに使ってみようと思います。