gpt4 book ai didi

c++ - 用 'grouped'元素迭代 vector ?

转载 作者:行者123 更新时间:2023-12-01 15:10:59 25 4
gpt4 key购买 nike

考虑以相同 vector 包装的4种颜色的示例(设计的这一方面不易更改,例如从第三方更改):

std::vector rgb_colors = {1,1,1,2,2,2,3,3,3,4,4,4};

以下可以工作:
for (size_t ci = 0; ci + 2 < rgb_colors.size(); ci+=3) {
auto& red_component = rgb_colors[ci];
auto& green_component = rgb_colors[ci+1];
auto& blue_component = rgb_colors[ci+2];
//...
}

在真空中,这种方法足够“纯真”。
但是,在现代c++ / etc。中,我通常避开这种编码方法,因为它更易碎/易错/冗余/等。现在更喜欢基于范围的循环,迭代器等。

那么,什么是 更具表现力的或优雅的解决方案?

更新:
添加了有关“数据布局”不能轻易更改的注释。

最佳答案

如评论中所述,创建代表颜色的struct,或者使用可能随图形库一起提供的颜色,以便您可以与之正确交互:

struct color {
int red, green, blue;
// Add members as you see fit
};

std::vector rgb_colors = {color{1,1,1}, color{2,2,2}, color{3,3,3}, color{4,4,4}};
// or
// std::vector<color> rgb_colors = {{1,1,1}, {2,2,2}, {3,3,3}, {4,4,4}};

for (auto& c : rgb_colors) {
auto& red_component = c.red;
auto& green_component = c.green;
auto& blue_component = c.blue;
//...
}

或者,您可以较少关注具体示例,而可以使用 boost::adaptors::stride之类的范围/迭代器适配器:
#include <boost/range/adaptor/strided.hpp>

//...

for (auto& c : boost::adaptors::stride(rgb_colors, 3)) {
auto& red_component = (&c)[0];
auto& green_component = (&c)[1];
auto& blue_component = (&c)[2];
//...
}

仍然(如您的示例所示)仍然需要您确保 3可以将 vector 的长度整除,以避免UB,并且首先确保元素是连续数组(如 std::vector提供)的一部分,以便指针算术 (&c)[i]具有明确定义的行为。

关于c++ - 用 'grouped'元素迭代 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60171719/

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