2013-10-22 101 views
1

我想創建一組數字範圍:0,1,2,3,4 ... 以下代碼無法編譯:不能使用std :: iota和std :: set

std::set<int> s; 
std::iota(s.begin(), s.end(), 0); 

與以下錯誤消息:

error C3892: '_First' : you cannot assign to a variable that is const 

編譯器是VC++ 2012。相同的代碼適用於矢量。我應該如何使用它?

UPDATE

我現在可以看到我的代碼是沒有意義的,因爲有沒有指定集合的​​大小。

下面是關於我的問題的一些更多細節。

我有一套包含[0,N]範圍內的一些數字。在我的應用程序中,我需要多次計算這些集合的集合差異。 N是固定的。

比方說N = 5和第一組是s1 = {0, 3, 4}。我需要計算集合差異{0, 1, 2, 3, 4} \ {0, 3, 4} == {1, 2}。這個操作對於不同的集合應該經常執行,所以我認爲我可以創建一個包含所有數字的集合(在這種情況下爲{0, 1, 2, 3, 4}),並使用std::set_difference來計算這些差異。

+0

這將是一個空操作的一個'std :: vector'。你想解決什麼問題? – juanchopanza

回答

11

爲了解決您的實際問題:std::set_difference與您預期的std::set相比較少。您可以使用任何一對迭代器作爲set_difference的前兩個參數,只要它們按順序返回值。它是一個集合沒有特別的好處。

因此,例如開始/包含值0 ... N-1,以便將工作,或一對boost::counting_iterator一個std::vector的端迭代:

std::set result; 
std::set_difference(
    boost::counting_iterator<int>(0), boost::counting_iterator<int>(n), 
    s1.begin(), s1.end(), 
    std::inserter(result, result.end()) 
); 

輸出不需要也可以使用vectorback_inserter

要解決您提出的問題:嘗試在一組上使用iota沒有任何意義。 iota通過爲其分配新值來更改範圍中包含的值。您不能指定set中的值。

如果你想包含號碼0 ... n-1,然後一組:

std::set<int> s; 
for (int i = 0; i < n; ++i) { 
    s.insert(s.end(), i); 
} 

如果有人告訴你,循環是wusses和真正的C++程序員使用的算法,那麼你可以得到iota參與,如果你真的想:

std::set<int> s; 
{ 
    std::vector<int> vec(n); 
    std::iota(vec.begin(), vec.end(), 0); 
    s.insert(vec.begin(), vec.end()); 
} 

不幸的是,這樣做效率低下。所以,如果你喜歡的算法這麼多,你還不如嫁給他們,那麼你就可以達到標準庫之外:

std::set<int> s(boost::counting_iterator<int>(0), boost::counting_iterator<int>(n)); 
+1

「所以,如果你非常喜歡算法,以至於你不妨嫁給他們,那麼你可以到達標準庫之外。」哈哈,爲真理和娛樂+1 +1 – sehe

+1

爲什麼不加上答案:你將counting_iterator直接傳遞給set_difference的那個... –

1

一個集合與矢量的不同之處在於矢量具有從索引到存儲在該索引處的值的關聯,而集合只具有集合中是否有值的信息。因此,將值分配給set元素是無意義的 - 實施它的方式是set中的元素是常量。

執行此操作的等效方法與刪除集合中不需要的值(向量中的「舊」值)類似,然後遍歷要存儲的值(與itoa它將會是一系列不斷增加的值),並將它們逐個添加到集合中。

2

稍微不雅的選擇:

set<int> s; 
generate_n(inserter(s, s.end()), 10, [&]{ return s.size(); }); 
+1

我不確定那個'static'變量,當你運行兩次代碼時會發生什麼? (不要複製和粘貼,這是可以的,因爲相同的lambda表達式仍然是不同的類型,我的意思是兩次執行相同的行)。不過,你可以在前一行使用'int i = 0;',並通過引用來捕獲它。 –

+0

好點,我會改變它。 – mattnewport

+0

返回s.size()變得太棘手? – mattnewport

相關問題