2

マルチセットがあり、そこから範囲を取得しています。この範囲をベクトルに追加して後で使用したいのですが、これが私がやっていることです:

class foo
{
    public:
        int a;
        foo(int a) : a(a){}
};
class FooPointerCompare
{
    public:
        bool operator()(const foo* a, const foo* b)
        {
            return a->a < b->a;
        }
};

std::multiset<foo*, FooPointerCompare> m;
std::vector<std::multiset<foo*, FooPointerCompare>::iterator> v;
auto pair = m.equal_range(new foo(5)); //leak here, I know
v.insert(v.end(), pair.first, pair.second);

しかし、私はこれらのエラーが発生します:

No matching constructor for initialization of 'std::__1::__tree_const_iterator<foo *, const std::__1::__tree_node<foo *, void *> *, int>'

No viable overloaded '='

シンプルを使用すると、for(auto it = pair.first; it != pair.second; it++) v.push_back(it);完全に機能します。vector::insert通話の何が問題になっていますか?

4

2 に答える 2

3

何が悪いのか

v.insert(v.end(), pair.first, pair.second);

と同等です

for (auto it = pair.first; it != pair.second; ++ it)
    v.push_back(*it);
//              ^

これはあなたの意図と同じではありません。私はあなたが望むことをするための標準的なアルゴリズムはないと思います。forループを書き出すだけの方が良いでしょう。

于 2012-11-21T18:16:29.447 に答える
3

vector::insertベクトルに挿入される値を指すイテレータを想定しています。

イテレータのベクトルがあるので、イテレータを反復処理するものを渡す必要があります。しかし、マルチセット内の要素を反復処理するものを渡しています。

したがって、これは、実行できないのと同じ理由で失敗します。

std::vector<char*> v;
char foo[10];
v.insert(v.end(), foo, foo+10);

また:

std::vector<int> v;
v.insert(v.end(), 0, 10);

3つの問題すべてに対する1つの解決策はboost::counting_iteratorです。あなたの場合:

v.insert(v.end(),
    boost::make_counting_iterator(pair.first), 
    boost::make_counting_iterator(pair.second)
);
于 2012-11-21T18:16:39.083 に答える