2011-11-07 54 views
2

我可以使用c的参考变量(例如,Customer &c)吗?如果是这样如何?这是更喜欢使用指针变量?C++参考vs指针for循环内变量?

for(std::vector<Customer*>::const_iterator it = customers_.begin(); 
     it != customers_.end() ; it ++) 
    { 
     Customer *c = (*it); 
     c->PrintName(); 
     ... 
    } 
+0

为什么不直接使用迭代器? IT-> PrintName(); – Ferruccio

+0

@Ferruccio:因为迭代器引用了一个指针,而不是一个对象。你必须做'(* it) - >' –

+0

我明白了。我错过了。 – Ferruccio

回答

6

是:

for(std::vector<Customer*>::const_iterator it = customers_.begin(); 
    it != customers_.end() ; it ++) 
{ 
    Customer &c = *(*it); 
    c.PrintName(); 
    ... 
} 

(括号是没有必要的,但可能会更清楚。)

+1

没有必要的parens。 :) – Xeo

+0

它应该是'const Customer&c',我认为'it'是'const_iterator'。 – Nawaz

+0

@Xeo:Jinx!.... –

3

您可以:

for(std::vector<Customer*>::const_iterator it = customers_.begin(); 
    it != customers_.end() ; it ++) 
{ 
    Customer const &c = **it; 
    c.PrintName(); 
    ... 
} 

你可能不想要这样做。 customers_应该是vector<Customer>而不是vector<Customer *>,而不是呼叫其PrintName成员,您应该将operator<<重载为Customer。完成之后,您将可以使用类似于:

std::copy(customers_.begin(), customers.end(), 
      std::ostream_iterator<Customer>(std::cout, "\n")); 
+0

+1好点。我已经经历了很多我的代码,并从引用语义转换为值语义。我正在看的特定代码我不确定这是否可能,但我会牢记它。也开始学习算法的使用,尽管它们并不总是立即显而易见,不管它们是帮助还是伤害可读性。 – User

+0

@User:在C++ 03中,这通常是可辩论的(尤其是从'for_each'调用成员函数与使用显式循环相比)。在C++ 11中,我很少看到一种算法效果不好的情况(我怀疑有一次我知道lambda表达式更好,尽管很少有持久性可能会消失)。 –

+0

您添加到引用变量的'const'是否无法调用Customer的非const方法?如果是这样,这是不同于我原来的代码的行为,虽然我可能能够在其他循环中使用这个事实。 – User