簡體   English   中英

在拋出“std::out_of_range”的實例后調用終止?

[英]terminate called after throwing an instance of 'std::out_of_range'?

我試圖查看map是否存在特定鍵,如果存在,那么我想將其值增加 1。但是在運行程序時我收到錯誤

在拋出 'std::out_of_range' what() 實例后調用終止:map::at

為什么會out_of_range有人可以幫忙嗎?

b 是此函數中的映射。 itr 是用於訪問其元素的迭代器

for(int i=0;i<n;i++)
{
        ct=0;
        cin>>a[i];
        for(itr=b.begin();itr!=b.end();itr++)
        {
            if(itr->first==a[i])
                ct++;
            else
                continue;
        }
        if(!ct)
        {
            b.at(a[i])++;
        }
        else
        {
            b.insert(pair <int,int>(a[i],1));
        }
    }

}

你可以用 3-4 行來寫整件事:

for (int i = 0; i < n; ++i) {
    cin >> a[i];
    ++b[a[i]];
}

下標運算符將自動插入{a[i], 0} ,如果a[i]不存在作為映射b的鍵。 然后增加它使其等效於您嘗試插入一對{a[i], 1}


你的方法有什么問題:

您在執行b.at(a[i])++之前使用的條件是錯誤的。 應該是if (ct)而不是if (!ct)

[改進]

您本可以break查找itr->first == a[i]為真。 但它的復雜性仍然是時間O(n) 這違背了使用std::map而不是std::vector<std::pair<int, int>> 如果使用std::map::find代替,則可以以對數時間復雜度執行該操作。 這里有更多方法。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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