相关疑难解决方法(0)

我如何迭代枚举?

我只是注意到你不能在枚举上使用标准数学运算符,如++或+ =

那么迭代C++枚举中所有值的最佳方法是什么?

c++ enums

282
推荐指数
12
解决办法
29万
查看次数

使用'for'循环遍历C++ Vector

我是C++语言的新手.我已经开始使用向量,并且已经注意到在我看到的所有代码中通过索引迭代通过向量,for循环的第一个参数总是基于向量.在Java中,我可以使用ArrayList执行类似的操作:

for(int i=0; i < vector.size(); i++){
   vector[i].doSomething();
}
Run Code Online (Sandbox Code Playgroud)

有没有理由我在C++中没有看到这个?这是不好的做法吗?

c++ iterator for-loop coding-style

119
推荐指数
11
解决办法
39万
查看次数

基于范围的语句定义冗余

查看n3092,在§6.5.4中,我们找到了基于范围的for循环的等价性.然后它继续说什么__begin__end等于.它区分了数组和其他类型,我觉得这是多余的(也就是令人困惑).

它表示数组类型__begin__end你所期望的:指向第一个的指针和指向一个结尾的指针.那么对于其他类型的,__begin__end等于begin(__range)end(__range),与ADL.命名空间std是关联的,以便在第24.6.5节中找到std::beginstd::end定义<iterator>.

但是,如果我们看的定义std::beginstd::end,他们是阵列以及容器类型都定义.并且数组版本与上面完全相同:指向第一个的指针,指向一个结尾的指针.

为什么需要将数组与其他类型区分开来,当为其他类型提供的定义同样适用时,查找std::beginstd::end


为方便起见,有些删节报价:

§6.5.4基于范围的for陈述

- 如果_RangeT是一个数组类型,则begin-expr和end-expr分别是__range和__range + __bound,其中__bound是数组绑定的.如果_RangeT是未知大小的数组或不完整类型的数组,则程序格式错误.

- 否则,begin-expr和end-expr分别是begin(__ range)和end(__ range),其中begin和end通过参数依赖查找(3.4.2)查找.出于此名称查找的目的,名称空间std是关联的名称空间.

§24.6.5范围访问

template <class T, size_t N> T* begin(T (&array)[N]);
Run Code Online (Sandbox Code Playgroud)

返回:数组.

template <class T, size_t N> T* end(T (&array)[N]);
Run Code Online (Sandbox Code Playgroud)

返回:数组+ N.

c++ for-loop range argument-dependent-lookup c++11

19
推荐指数
1
解决办法
3459
查看次数

基于无辜范围的循环无效

以下内容无法编译:

#include <iostream>

int main()
{
    int a{},b{},c{},d{};

    for (auto& s : {a, b, c, d}) {
        s = 1;
    }
    std::cout << a << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Godbolt上尝试

编译器错误是: error: assignment of read-only reference 's'

现在,在我的实际情况中,列表由类中的成员变量组成。

现在,这不起作用,因为表达式变为initializer_list<int>实际上复制a,b,c和d的a,因此也不允许修改。

我的问题有两个:

不允许以这种方式编写基于范围的for循环背后有动机吗? 例如。也许会有一些特殊的情况来表达裸括号。

修复此类循环的语法整洁方法是什么?

最好遵循以下方式:

for (auto& s : something(a, b, c, d)) {
    s = 1;
}
Run Code Online (Sandbox Code Playgroud)

我认为指针间接寻址不是一个好的解决方案(即{&a, &b, &c, &d})-在取消迭代器时,任何解决方案都应直接给元素提供引用

c++ for-loop initializer-list c++17

12
推荐指数
1
解决办法
228
查看次数

究竟是如何工作的?

for当我弄清楚它是如何工作的时候,我正在阅读关于"范围"的陈述.

下面是一个将字符串转换为大写的程序.

string s("Hello World!!!");

//convert s to uppercase

for( auto &c :s )  // for every char in s
   c= topper(c);   //  c is a reference,so the assignment changes the 
                   //  char in s
cout<< s << endl;
Run Code Online (Sandbox Code Playgroud)

对字符串的引用(即,c)是如何将元素更改为upppercase的?

我已经搜索了迭代如何在这里工作,但我找不到答案.

c++ for-loop reference c++11

2
推荐指数
1
解决办法
77
查看次数

在c ++数组中是否有等效的php"foreach"

在标题中,是否有任何类型的"foreach"等效于数组,或者它只适用于向量?我已经问了一位计算机科学教授,他只回答了更复杂的结构,我们在课程中看不到这些结构.

c++ foreach

1
推荐指数
1
解决办法
249
查看次数

你能把指针投射到数组中吗?

我有一个指针"a",它是A*类型.我现在在该地址有n个类型为A的对象,我想迭代它们.

我想把它转换为A [n],这样我就可以使用c ++ 11范围来编写for (auto temp : a){...}.当然,我可以使用经典for(int i=0; i<n; i++) {temp=a[i]; ...}但范围更清洁.

c++ c++11

1
推荐指数
1
解决办法
456
查看次数