2

私はこのような構造体を持っています:

struct group
{
    int index; 
    string name; 
    group* child;

};

そして、いくつかのグループ構造体を格納するためのベクトルを設定しました。

今、私は次のようなインデックスによってそのベクトルからグループメンバーを取得する関数を作成しようとしています。

148    newGroup.child = getGroupByIndex(world, i);

そして、関数の定義は次のとおりです。

group& getGroupByIndex(vector<group>* world, int i)
{
    for(vector<group>::iterator it = world->begin();
        it < world->end(); ++it)
    {
        if(it->index == i) return *it;
    }
267     return 0;
}

残念ながら、コンパイルすらできません。

そして、エラーメッセージは次のとおりです。

tree.cpp: In function ‘int main()’: 
tree.cpp:148: error: cannot convert ‘group’ to ‘group*’ in assignment 
tree.cpp: In function ‘group& getGroupByIndex(std::vector<group, std::allocator<group> >*, int)’: 
tree.cpp:267: error: invalid initialization of non-const reference of type ‘group&’ from a temporary of type ‘int’

私の2つの問題、

  1. コンパイルエラーを修正する方法は?どのリターンタイプを使用する必要がありますか?

  2. 267行目にnullポインタを返したい場合は、何を使用すればよいですか?(void *)0と0を試しましたが、どちらも機能しません。

4

3 に答える 3

0

私はそれがこのようになるべきだと思います:

group* getGroupByIndex(vector<group*> world, int i) // See position of two *
{
    for(vector<group*>::iterator it = world.begin();
        it < world.end(); ++it)
    {
        if(it->index == i)
          return *it;
    }
    return 0;
}

また

group* getGroupByIndex(vector<group> *world, int i) // See position of two *
{
    for(vector<group>::iterator it = world->begin();
        it < world->end(); ++it)
    {
        if(it->index == i)
          return &(*it);
    }
    return 0;
}
于 2013-03-04T06:40:26.737 に答える
0

ポインタへの参照を優先する場合は、関数によって返される「見つからない」グループオブジェクトを定義することもできます。

私はこのようにします:

struct group
{
    int index; 
    string name; 
    group* child;
    group(int i):index(i),child(null){}
    group(int i, const string& n, group& c):index(i), name(n), child(&c){}

    // assuming index defines the uniqueness of your object class
    bool operator == (const struct group& g)const {return (index == g.index);}

    // an unique special instance of group struct
    static struct group not_found;
};
group group::not_found(-1);

したがって、関数を希望どおりに定義できます。

group& getGroupByIndex(vector<group>* world, int i)
{
    for(vector<group>::iterator it = world->begin();
        it < world->end(); ++it)
    {
        if(it->index == i) return *it;
    }
    return group::not_found; // a reference to a special singleton instance of struct group
}

そして、あなたはこのような電話をかけることができるでしょう:

...
group& g = getGroupByIndex(world, index);
if(g == group::not_found)
{
   // handle the not found case here
   ...
于 2013-03-04T09:28:54.420 に答える
0

使用する

boost::optional

最新のC++の最初のルール:****ingポインターを使用しないでください。

boost::optional<group&> get(vector<group>& world, int i)
{
    for(auto & grp : world)
    {
        if(grp.index == i)
           return boost::optional<group&>(grp);
    }
    return boost::none;
}

O(n)このソリューションは複雑であることに注意してください。に基づいて検索する場合は、でソートされたオブジェクトへのindex参照を持つ構造を使用することをお勧めします。これにより、検索時間が長くなります。groupindexO(log n)

その場合、私はおそらくshared_ptrsとaのベクトルを保持しmap<int, weak_ptr>ます。また、見ることができますboost::multi_index

ああ、そして2)私がちょうど気づいたあなたのポイントへの単なる補足:nullptr

于 2013-03-04T12:00:43.480 に答える