簡體   English   中英

C++中基於范圍的for循環歧義

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM