2016-07-31 59 views
1

我想了解std :: transform函數是如何工作的,但是我對下面的代碼有點麻煩。我想採取multiset毫秒,加1到每個元素的內容,並將它們存儲在一個新的multiset msc中。以下是我有:std ::轉換multiset給我錯誤C3892

int op_increase(int i) { return ++i; } 

int main() 
{ 

std::multiset<int> ms = {1,1,2,2,3}; 
std::multiset<int> msc; 
std::transform(ms.begin(), ms.end(), msc.begin(), op_increase); 

return 0; 
} 

不過,我得到以下錯誤:

C3892:_dest:你不能分配給一個變量是常量

+0

這不是_runtime error_! –

回答

3

你的代碼是沒有使用正確的參數std::transform允許插入一個空的容器。這需要使用足夠智能的迭代器來調用調用容器的insert()函數的適當函數。

解決的辦法是提供std::transform迭代器,它會自動插入空的multiset。這裏有一個例子:

#include <set> 
#include <algorithm> 
#include <iterator> 

int op_increase(int i) { return ++i; } 

int main() 
{ 
    std::multiset<int> ms = {1,1,2,2,3}; 
    std::multiset<int> msc; 
    std::transform(ms.begin(), ms.end(), std::inserter(msc, msc.begin()), op_increase); 
    // msc now contains 2,2,3,3,4 
} 

注意std::inserter被使用,而不是僅僅msc.begin()。插件將自動將項目插入到地圖中。

Live Example

+0

非常感謝你,工作! – lebman

2

這裏的問題是,std::multiset<T>::begin()返回std::_Tree_const_iterator類型。這就是爲什麼你不能改變它的價值。這種行爲是明智的:std::multiset(如std::set)是一個典型的實現爲紅黑樹的已排序容器,因此更改一個元素的值可能需要更新整個數據結構。如果用戶真的想這樣做,他可能會擦除一個節點並將其添加回來。

爲了更好地理解std::transform行爲,您可以使用std::vector容器而不是std::multisetCplusplus.com包含使用std::transform的一個很好的代碼示例。

此外,據我瞭解你的代碼,你嘗試將結果數據添加到最初爲空std::multiset。爲了實現這一功能,你可以使用std::insert_iteratorCplusplus.com),像這樣:

int op_increase(int i) { return ++i; } 

int main() 
{ 
    std::multiset<int> ms = {1,1,2,2,3}; 
    std::multiset<int> msc; 
    std::transform(ms.begin(), ms.end(), inserter(msc, msc.begin()), op_increase); 
    return 0; 
} 
+1

好的,謝謝,那麼如果我想用multiset使用std :: transform,我該怎麼辦? – lebman

+0

雅我看到在cplusplus.com上發佈的例子,我能夠理解它,但我需要這樣做,專門爲一個任務。 – lebman

+0

@lebman - 你的任務是錯誤的。你不能使用'std :: transform'將項目插入空容器中,而不使用足夠聰明的迭代器來完成插入。 – PaulMcKenzie

相關問題