哪种实现对代码可读性更好?
Which implementation is better for code readability?
我有这段代码,其目的只是将所有区域初始化为 false
:
Zone per_zone;
std::fill_n(per_zone.begin(), per_zone.capacity(), false);
System per_system;
std::fill_n(per_system.begin(), per_system.capacity(), per_zone);
std::fill_n(m_pMemory->TrackingZonesShowingLogicalParcels.begin(), m_pMemory->TrackingZonesShowingLogicalParcels.capacity(), per_system);
我用下面的代码重构了它,因为我觉得它表达的意图更清楚,而且更短。
for (auto& group : m_pMemory->TrackingZonesShowingLogicalParcels)
for (auto& system : group)
for (auto& zone : system)
zone = false;
我真的会使用算法,因为我知道——一般来说——算法比 for 循环更清楚地表达意图,但我认为情况并非如此。
我错了吗?
我可以使用另一种方法使用 std 算法使代码更具可读性?
请注意,我不关心这个的性能。
谢谢。
我不知道 OP 是否可以使用 C++20,但能够遍历像这样的深层嵌套层次结构的一般想法正是 std::ranges::join_view
的目的。
使用它,您可以将目标元素的聚合和对聚合引用的操作分离为两个不同的操作:
#include <ranges>
#include <vector>
#include <algorithm>
struct Memory {
using System = std::vector<int>;
using Group = std::vector<System>;
std::vector<Group> TrackingZonesShowingLogicalParcels;
};
void foo(Memory* m_pMemory)
{
// Create a view representing all of the zones
auto all_zones = m_pMemory->TrackingZonesShowingLogicalParcels | std::views::join | std::views::join;
// use that view as if it was a container.
std::fill(all_zones.begin(), all_zones.end(), 1);
}
我有这段代码,其目的只是将所有区域初始化为 false
:
Zone per_zone;
std::fill_n(per_zone.begin(), per_zone.capacity(), false);
System per_system;
std::fill_n(per_system.begin(), per_system.capacity(), per_zone);
std::fill_n(m_pMemory->TrackingZonesShowingLogicalParcels.begin(), m_pMemory->TrackingZonesShowingLogicalParcels.capacity(), per_system);
我用下面的代码重构了它,因为我觉得它表达的意图更清楚,而且更短。
for (auto& group : m_pMemory->TrackingZonesShowingLogicalParcels)
for (auto& system : group)
for (auto& zone : system)
zone = false;
我真的会使用算法,因为我知道——一般来说——算法比 for 循环更清楚地表达意图,但我认为情况并非如此。
我错了吗? 我可以使用另一种方法使用 std 算法使代码更具可读性?
请注意,我不关心这个的性能。 谢谢。
我不知道 OP 是否可以使用 C++20,但能够遍历像这样的深层嵌套层次结构的一般想法正是 std::ranges::join_view
的目的。
使用它,您可以将目标元素的聚合和对聚合引用的操作分离为两个不同的操作:
#include <ranges>
#include <vector>
#include <algorithm>
struct Memory {
using System = std::vector<int>;
using Group = std::vector<System>;
std::vector<Group> TrackingZonesShowingLogicalParcels;
};
void foo(Memory* m_pMemory)
{
// Create a view representing all of the zones
auto all_zones = m_pMemory->TrackingZonesShowingLogicalParcels | std::views::join | std::views::join;
// use that view as if it was a container.
std::fill(all_zones.begin(), all_zones.end(), 1);
}