我真的很喜欢 C++11 及更高版本支持的基于 Ranged-based-for-loop。我想出于某种理解的原因来模拟它。这是一个例子:
// 1
//#define ranged_for(X, T) \
// for (std::vector<int>::iterator beg{ T.begin() },\
// end{ T.end() }; beg != end; X = *beg, ++beg)\
// 2
//#define ranged_for(X, T) \
// for (std::vector<int>::iterator beg{ T.begin() },\
// end{ T.end() }; beg != end; ++beg, X = *beg)\
// 3
#define ranged_for(X, T) \
for (std::vector<int>::iterator beg{ T.begin() },\
end{ T.end() }; beg != end; ++beg)\
X = *beg,
int main(){
std::vector<int> data{75, 435, 6578, 92, 123};
auto i{ 0 };
ranged_for(i, data)
std::cout << i << std::endl;
std::cout << std::endl;
std::cin.get();
return 0;
}
正如您在上面看到的,第一个宏没有得到第一个元素75
,而是值0
,最后一个不存在。那是因为我猜在我的 main 中,我x
在将其分配到循环的后迭代部分之前打印。
第二个宏使程序崩溃,因为我认为取消引用最后一个节点(哨兵节点)。
第三个工作正常,但正如您在宏扩展后看到的那样,我会得到:
i = *beg, std::cout << i << std::endl;
这是因为上面的行被视为单个语句。有没有更好的方法和解释。谢谢各位好兄弟!。