确定。这是我的代码:
CShop::~CShop()
{
TPacketGCShop pack;
pack.header = HEADER_GC_SHOP;
pack.subheader = SHOP_SUBHEADER_GC_END;
pack.size = sizeof(TPacketGCShop);
Broadcast(&pack, sizeof(pack));
GuestMapType::iterator it;
it = m_map_guest.begin();
while (it != m_map_guest.end())
{
LPCHARACTER ch = it->first;
ch->SetShop(NULL);
++it;
}
M2_DELETE(m_pGrid);
}
我有GuestMapType::iterator it;
和it = m_map_guest.begin();
如果我像这样做我的功能,那很好吗?
CShop::~CShop()
{
TPacketGCShop pack;
pack.header = HEADER_GC_SHOP;
pack.subheader = SHOP_SUBHEADER_GC_END;
pack.size = sizeof(TPacketGCShop);
Broadcast(&pack, sizeof(pack));
auto it = m_map_guest.begin();
while (it != m_map_guest.end())
{
LPCHARACTER ch = it->first;
ch->SetShop(NULL);
++it;
}
M2_DELETE(m_pGrid);
}
我删除了GuestMapType :: iterator;简化我的代码? 我的问题是。影响我的程序?有风险吗?
答案 0 :(得分:5)
完全没问题,从我看来,用auto
声明迭代器是一个很好的做法,至少有两个原因:
1-通常,迭代器的类型很长。输入的次数越少,误输的次数就越少。它使代码更加清晰,因为在这种情况下隐藏了一个并不重要的实现细节。
2- 向前兼容性:当您修改代码时,即迭代器类型名称的名称时,您不必更改使用auto
的代码。毕竟,您想要使用那种类型的迭代器,与其名称无关。
答案 1 :(得分:1)
如果m_map_guest.begin()
的返回类型可以确定为GuestMapType::iterator
,则应该没有区别。
auto
输入不是一些神奇的动态/弱类型,它只是编译器的一个指示器,它应该计算 强 类型本身,没有你明确的 1 。这两行之间存在 没有 功能差异:
int i = 7;
auto i = 7;
因为编译器使用第二个示例中7
的类型来推断i
的实际类型。
您通常应尽可能使用auto
,原因与您在C中使用其中第二项相同:
ttype *x = malloc(sizeof (ttype));
ttype *x = malloc(sizeof (*x));
如果类型改变为其他类型,后者只需要一个更改 - 随着auto
变得更加重要,因为实际类型和声明可以更广泛地分开。 / p>
1 当然,如果返回类型不同,,例如隐式转换或子类,编译器有点难以找出你的类型想。因此在这些情况下可能不起作用。