c – 在这种情况下我应该避免“转到”吗?

c – 在这种情况下我应该避免“转到”吗?,第1张

概述我正在创建一个“连接迭代器”,即迭代器将迭代int **中的int. 它的构造函数需要: > T **数组,表示每个子数组的开头. > T **数组,表示每个子数组的结尾. 瞧,我遇到了goto似乎合适的情况. 但是我内心的某些东西尖叫着“不!”所以我以为我会来这里问: 我应该尝试避免像这样的goto情况吗? (如果我这样做,它会提高可读性吗?) #include <algorithm>tem 我正在创建一个“连接迭代器”,即迭代器将迭代int **中的int.

它的构造函数需要:

> T **数组,表示每个子数组的开头.
> 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-arraypublic:    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;
总结

以上是内存溢出为你收集整理的c – 在这种情况下我应该避免“转到”吗?全部内容,希望文章能够帮你解决c – 在这种情况下我应该避免“转到”吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存