当前位置: 首页 > 知识库问答 >
问题:

如何在C中迭代非常量变量?

顾穆冉
2023-03-14
#include <initializer_list>

struct Obj {
    int i;
};

Obj a, b;

int main() {
    for(Obj& obj : {a, b}) {
        obj.i = 123;   
    }
}

此代码未编译,因为初始值设定项列表中的值{a,b}被视为常量Obj

有没有一种简单的方法可以让类似的构造工作,即迭代不同变量中的值,比如这里的ab


共有3个答案

斜向文
2023-03-14

如果复制ab是所需的行为,则可以使用临时数组而不是初始化列表:

#include <initializer_list>

struct Obj {
    int i;
} a, b;

int main() {
    typedef Obj obj_arr[];
    for(auto &obj : obj_arr{a, b}) {
        obj.i = 123;   
    }
}

即使Obj只有一个移动构造函数,这也是有效的。

子车俊材
2023-03-14

这不起作用的原因是std::initializer_list的底层元素是从ab复制的,并且类型为const Obj,因此您实际上是在尝试将常量值绑定到可变引用。

可以尝试使用以下方法解决此问题:

for (auto obj : {a, b}) {
    obj.i = 123;
}

但是很快就会注意到对象abi的实际值没有改变。原因是在这里使用auto时,循环变量obj的类型将变为obj,因此您只需循环ab的副本。

实际的解决方法是可以使用std::ref(在

#include <functional>
#include <initializer_list>
#include <iostream>

struct Obj {
    int i;
};

Obj a, b;

int main()
{
    for (Obj& obj : {std::ref(a), std::ref(b)}) { 
        obj.i = 123;
    }
    std::cout << a.i << '\n';
    std::cout << b.i << '\n';
}

输出:

123
123

执行上述操作的另一种方法是使循环使用const自动

for (const auto& obj : {std::ref(a), std::ref(b)}) { 
    obj.get().i = 123;
}

但是我认为,因为在这里使用auto会强制使用. get(),这是相当麻烦的,前一种方法是解决这个问题的更好方法。

通过在循环中使用原始指针来实现这一点似乎更简单,就像@Francesco在他的回答中所做的那样,但是我有一个尽可能避免原始指针的习惯,在这种情况下,我只是相信使用引用可以使代码更清晰更干净。

桂德义
2023-03-14

它不起作用,因为在{a,b}中,您正在制作ab的副本。一种可能的解决方案是将循环变量设为指针,获取ab的地址:

#include <initializer_list>

struct Obj {
    int i;
};

Obj a, b;

int main() {
    for(auto obj : {&a, &b}) {
        obj->i = 123;   
    }
}

看它直播

注意:通常最好使用auto,因为它可以避免静默隐式转换

 类似资料:
  • 有没有办法在for循环中使变量可迭代?我正在尝试制作一个密码生成器,对于for循环,我使用一个输入数字的变量。 当我试图在循环中使用变量时,我得到< code > ' int ' object is not iterable 。

  • 本文向大家介绍C++ 向量迭代器,包括了C++ 向量迭代器的使用技巧和注意事项,需要的朋友参考一下 示例 begin将an返回iterator到序列容器中的第一个元素。 end返回iterator末尾的第一个元素。 如果矢量对象const,无论是begin和end返回const_iterator。如果const_iterator即使向量不返回,也要返回const,则可以使用cbegin和cend。

  • 我有一个自定义模板类- 我想要一个常量迭代器开始于myClass,常量迭代器结束于myClass,它能够迭代myClass矩阵中的对象T,我正在努力创建这样的东西。 在我看来,我想把矩阵上的所有对象T聚集到某个局部一维向量,然后返回迭代器。从这个向量或迭代器开始。结束这个向量 此外,我希望能够支持for-each循环如下: 谢谢!

  • 所以我做了一个简单的web应用程序,你输入一些文本,它就会显示在屏幕上,有点像聊天屏幕。 我的Python代码 我的HTML代码 日志和html都显示他们正在发送和接收数据。但是,它不打印的值,而是只打印。我很确定这是因为HTML文件。我肯定这可能是个新手犯的错误,但你知道怎么解决吗?

  • 如何在Java 8 lambda中使用非final变量。它抛出编译错误,称“封闭范围中定义的局部变量日期必须是final或实际上是final” 我实际上想实现以下目标: 如何实现此目的?它会为 date2 引发 comilation 错误。谢谢

  • 谢谢,伊利亚