我有这样的结构:
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’
我的两个问题,
如何修复编译错误?我应该使用什么样的退货类型?
如果我想在第267行返回空指针,我应该使用什么?我试过(void *)0和0,但都不起作用。
答案 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
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
。