gpt4 book ai didi

c++ - 如何实现我的自定义范围 for 循环?

转载 作者:行者123 更新时间:2023-11-28 01:25:43 32 4
gpt4 key购买 nike

我非常喜欢 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;

那是因为上面这行被当成了一个单独的语句。有没有更好的方法和解释。谢谢大家!

最佳答案

这应该适用于单行和多行范围:

#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
}

关于c++ - 如何实现我的自定义范围 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53964395/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com