[英]Range-based for loop ambiguity in C++
這兩段代碼:
一種)
void KMeans<N>::assign_pixels_to_clusters()
{
for (auto cluster : clusters)
{
cluster.clear_pixels();
}
for (auto pixel : pixels)
{
float min_distance = FLT_MAX;
Cluster<N> c;
for (auto cluster : clusters)
{
float distance = norm(
pixel.get_value(),
cluster.get_centroid()
);
if (distance < min_distance)
{
min_distance = distance;
c = cluster;
}
}
c.add_pixel(pixel);
}
}
和乙)
template <size_t N>
void KMeans<N>::assign_pixels_to_clusters()
{
for (auto cluster : clusters)
{
cluster.clear_pixels();
}
for (auto pixel : pixels)
{
float min_distance = FLT_MAX;
int idx = 0;
for (int i = 0; i < no_of_clusters; i++)
{
float distance = norm(
pixel.get_value(),
clusters[i].get_centroid()
);
if (distance < min_distance)
{
min_distance = distance;
idx = i;
}
}
clusters[idx].add_pixel(pixel);
}
}
看起來與我相似,但只有 B) 按照我想要的方式工作。 在 A) 的情況下,像素根本沒有分配給簇。 代碼 A) 運行后,簇為空並且沒有分配給它們的像素。 你能幫我理解為什么嗎?
在您的A
版本中,您正在這一行制作集群的副本:
c = cluster;
所以當你這樣做
c.add_pixel(pixel);
您沒有更改clusters
范圍。
出於同樣的原因,這個循環:
for (auto cluster : clusters)
{
cluster.clear_pixels();
}
實際上並沒有清除clusters
中任何簇的像素,因為每個cluster
都是一個副本。 如果你真的想引用clusters 中的每個clusters
,你需要這樣做:
for (auto & cluster : clusters)
{
cluster.clear_pixels();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.