c – 在这种情况下我应该避免“转到”吗?
发布时间:2020-12-16 10:53:11 所属栏目:百科 来源:网络整理
导读:我正在创建一个“连接迭代器”,即迭代器将迭代int **中的int. 它的构造函数需要: T **数组,表示每个子数组的开头. T **数组,表示每个子数组的结尾. 瞧,我遇到了goto似乎合适的情况. 但是我内心的某些东西尖叫着“不
我正在创建一个“连接迭代器”,即迭代器将迭代int **中的int.
它的构造函数需要: > T **数组,表示每个子数组的开头. 瞧,我遇到了goto似乎合适的情况. 但是我内心的某些东西尖叫着“不!”所以我以为我会来这里问: 我应该尝试避免像这样的goto情况吗? (如果我这样做,它会提高可读性吗?) #include <algorithm> template<class T> class lazy_concat_iterator { // This code was meant to work for any valid input iterator // but for easier reading,I'll assume the type is: T** mutable T** m_endIt; // points to an array of end-pointers mutable T** m_it; // points to an array of begin-pointers mutable bool m_started; // have we started iterating? mutable T* m_sub; // points somewhere in the current sub-array mutable T* m_subEnd; // points to the end of the current sub-array public: lazy_concat_iterator(T** begins,T** ends) : m_it(begins),m_endIt(ends),m_started(false) { } void ensure_started() const { if (!m_started) { m_started = true; INIT: m_sub = *m_it; m_subEnd = *m_endIt; if (m_sub == m_subEnd) // End of this subarray? { ++m_it; ++m_endIt; goto INIT; // try next one <<< should I use goto here? } } } }; 你如何使用它: #include <vector> #include <cstring> using namespace std; int main(int argc,char* argv[]) { vector<char*> beginnings(argv,argv + argc); vector<char*> endings; for (int i = 0; i < argc; i++) endings.push_back(argv[i] + strlen(argv[i])); lazy_concat_iterator<char> it(&beginnings[0],&endings[0]); it.ensure_started(); // 'it' would call this internally,when dereferenced } 解决方法
是的,你可以而且应该避免goto,例如这段代码应该与你在INIT标签上做的相同(这也适用于输入迭代器,这是一个“隐藏的要求”,因为它不会取消引用m_it和m_endIt额外的一旦满足条件,时间不同于我之前的转换):
while ((m_subIt = *m_it) == (m_subEnd = *m_endIt)) { ++m_it; ++m_endIt; } 以前的回答尝试: 即使是永远的循环也会比goto更清晰,更整洁.它突出了明显的“永不终止”的可能性甚至更好. for (;;) { m_sub = *m_it; m_subEnd = *m_endIt; if (m_sub != m_subEnd) break; ++m_it; ++m_endIt; } 虽然我不明白为什么你需要在循环中分配m_subEnd和m_subIt.如果不这样做,你可以将其重写为while循环: while (*m_it == *m_endIt) { ++m_it; ++m_endIt; } m_subIt = *m_it; m_subEnd = *m_endIt; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |