簡體   English   中英

如何實現自定義范圍的for循環?

[英]How can implement my custom ranged for loop?

我真的很喜歡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和最后一個都不在那里。 那是因為我想在我的主代碼中先打印x然后再在循環的迭代后部分分配它。

  • 第二個宏使程序崩潰,這是因為我認為取消引用最后一個節點(哨兵節點)。

  • 第三個工作正常,但是如您所見,在宏擴展之后,我會得到:

     i = *beg, std::cout << i << std::endl; 

這是因為上面的行被視為單個語句。 有沒有更好的方法和解釋。 謝謝大家好家伙!

為什么您如此反對基於范圍的C ++循環呢?

int i;
ranged_for(i, data)
    // ...

for(int i : data)

到目前為止,您需要預先聲明i 您不能以這種方式使用引用! 現在讓我們想象一下,我們設法使其變得更加聰明:

ranged_for(int& i, data)

for(int& i : data)

你得到了什么? 使用逗號而不是冒號??? 老實說,這不值得付出努力。 需要考慮的場景:

auto i = data.end();
for(auto j = data.begin(); j != data.end(); ++j)
{
    if(someCondition)
        i = j;
}
if(i != data.end())
{
    // ...
}

好吧,那已經很罕見了。 在很多情況下(如果不是大多數情況下),您可以將外部if的主體移入內部,在末尾添加一個break指令。 在這幾種情況下,您仍然不能這樣做-好吧, 我就可以使用顯式的迭代器循環-編寫起來並不那么繁重...

這對單行和多行示波器均適用:

#define ranged_for(X, T) \
    for(auto it=std::begin(T); it!=std::end(T) && (X=*it,true); ++it)

或者可以用來自動推斷X類型的版本,但是它需要一個附加的宏:

#define ranged_for(X, T) \
    {decltype(T)::value_type X; for(auto it=std::begin(T); it!=std::end(T) && (X=*it,true); ++it) {

#define range_end }}

int main(){
    std::vector<int> data{75, 435, 6578, 92, 123};

    ranged_for(i, data)
        std::cout << i << std::endl;
    range_end
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM