gpt4 book ai didi

c++ - C++ 中的 n={0,1,...,n-1}

转载 作者:太空宇宙 更新时间:2023-11-04 14:47:24 24 4
gpt4 key购买 nike

自然数 n 的正式定义(在集合论中)如下:

  • 0是空集
  • 1 = {0}
  • n = {0,1,...,n-1}

我认为如果我被允许这样做的话,这会使一些 C++ 代码更简单:

for (int n : 10)
cout << n << endl;

它打印了从 0 到 9 的数字。

所以我尝试执行以下操作,但无法编译:

#include <iostream>
#include <boost/iterator/counting_iterator.hpp>


boost::counting_iterator<int> begin(int t)
{
return boost::counting_iterator<int>(0);
}

boost::counting_iterator<int> end(int t)
{
return boost::counting_iterator<int>(t);
}



int main()
{
for (int t : 10)
std::cout << t << std::endl;

return 0;
}

关于如何实现这一点有什么建议吗?使用 clang++ 时出现以下错误:

main.cpp:22:20: error: invalid range expression of type 'int'; no viable 'begin' function available
for (int t : 10)
^ ~~

但我认为我应该被允许这样做! :)

编辑:我知道如果我在 for 循环中添加单词“range”(或其他单词)我可以“伪造”它,但我想知道是否可以这样做没有。

最佳答案

这是不可能的。来自 draft of the C++ 14 standard 的第 6.5.4 节(但 C++11 会非常相似)

begin-expr and end-expr are determined as follows:

(1.1) — if _RangeT is an array type, [...];

嗯,这个显然不适用。 int 不是数组

(1.2) — if _RangeT is a class type, [...]

不,这也不适用。

(1.3) — otherwise, begin-expr and end-expr are begin(__range) and end(__range), respectively,

哦!这看起来很有希望。您可能需要将 beginend 移动到全局命名空间中,但仍然...

where begin and end are looked up in the associated namespaces (3.4.2). [ Note: Ordinary unqualified lookup (3.4.1) is not performed. — end note ]

(强调我的)。打扰!没有任何 namespace 与 int 关联。具体从3.4.2节

— If T [int in our case] is a fundamental type, its associated sets of namespaces and classes are both empty.

唯一的解决方法是编写一个类range,它有一个合适的开始和结束方法。然后你可以写出非常pythonic的:

for (int i : range(5))

关于c++ - C++ 中的 n={0,1,...,n-1},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47020276/

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