如何将下面这样的循环转换为C风格?
for (auto element : vector) {
Do_Somethin();
}
您可以从将其转换为基于非范围的for循环开始。
{
auto&& range = Chains;
using std::begin; using std::end; // possibly cbegin/cend
auto it = begin(range); // possibly cbegin
auto end = end(range); // possibly cend
for(; it!=end; ++it) {
auto block = *it;
// body of loop
}
}
然后你把每一块都拆开。
从推导auto
变量开始。如果你必须这样做,那么做一个static_assert( std::is_same_v< decltype(begin), your_guess > );
来确认。确认后,请更换。不要猜测和交换类型,并假设";它编译了,我做对了";;这可能会导致微妙的错误。
然后用等价的表达式替换begin
和end
。你必须做一些研究(它可以是数组的原始指针,也可以是.begin
方法,也可以在范围表达式的命名空间中是一个免费的begin
函数(。
接下来会发生什么取决于您的迭代器在这里。它们是普通的指针吗?如果是这样的话,问题可能很简单。如果没有,你还有更多的工作要做。
最后,删除所有引用,然后进行整理。
理想情况下,您希望将这些步骤中的每一个都作为git提交,并通过单元测试来确认行为没有改变。如果没有这样的测试,您似乎没有资格进行这些更改。这没关系,单元测试将有价值。
反过来说,还有C++到C的翻译器。在实践中,它们将生成不可读和不可维护的代码。
但是输出可以由C编译器编译。
是的,您总是可以用ranged for来交换经典的for循环
要使ranged For工作,Chains
必须是实现迭代器接口的类型,或者必须是数组。
如果它是一个数组,你知道该怎么做。
否则,您可以将循环写成:
for (auto it = Chains.begin(), end = Chains.end(); it != end; ++it)
{
auto block = *it;
Do_Somethin();
}
(不过,如果只有const接口可用,并且由于某种原因begin()
没有const
过载,则可能需要cbegin()
。(
如果Chains
类型支持operator[]
的随机访问,您也可以尝试以下操作:
for (std::size_t i = 0; i < Chains.size(); ++it)
{
auto block = Chains[i];
Do_Somethin();
}
…不过您需要查看文档以了解.size()
实际应该是什么。
当然,C没有迭代器或auto
,但它也没有类。如果您愿意,也可以选择替换这些功能。