我应该使用什么返回类型进行指针赋值?

时间:2013-03-04 06:11:18

标签: c++ pointers vector

我有这样的结构:

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’

我的两个问题,

  1. 如何修复编译错误?我应该使用什么样的退货类型?

  2. 如果我想在第267行返回空指针,我应该使用什么?我试过(void *)0和0,但都不起作用。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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
   ...

答案 2 :(得分: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进行搜索,我建议您使用一个引用group对象的结构,该对象按index排序,这将为您提供O(log n)个查找时间。

在这种情况下,我可能会持有shared_ptr s和map<int, weak_ptr>的向量。您还可以查看boost::multi_index

啊,只是我刚注意到的2)点的旁注:nullptr