2013-06-20 19 views
0
std::set<std::string> tradedSymbolSet; 
//.. 
// tradedSymbols is filled 
//.. 
std::set<std::string> symbols; 
//... 
// symbols is filled 
//.. 

std::set_difference(tradedSymbolSet.begin(), tradedSymbolSet.end(), 
     symbols.begin(), symbols.end(), diffSet.begin()); 

我得到這個編譯錯誤:我得到編譯錯誤,而使用set_difference

"error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::basic_string<_Elem,_Traits,_Alloc>' (or there is no acceptable conversion)"

抱怨set_difference功能的使用。我不能讓

+0

你忘了#包括? – Bathsheba

+0

@Bathsheba:它包含在內。 – xyzt

+0

'diffSet'' const'? –

回答

3

我猜diffSetstd::set。如果是這樣,這是問題:std::set存儲元件爲const對象,這意味着該對象指向std::set::iterator只讀。你不能寫信給它。

使用std::vectorstd::back_inserter爲:

std::vector<std::string> diff; 

std::set_difference(tradedSymbolSet.begin(), tradedSymbolSet.end(), 
     symbols.begin(), symbols.end(), std::back_inserter(diff)); 

一旦你有diff,你可以創建一個對象diffSet爲:

std::set<std::string> diffSet(diff.begin(), diff.end()); 

或者插入元素現有的一組爲:

std::set<std::string> existingDiffSet; 
//some code... 

existingDiffSet.insert(diff.begin(), diff.end()); 

希望有所幫助。

+1

這是正確的..謝謝。 – xyzt

+0

你可以在'std :: set'上使用set函數,雖然它不像使用排序向量那樣習慣。如果他真的需要一個set,並且使用'set_difference'是其中一個,那麼這就是我要去的路線。如果他正在做很多'set _...',我建議將所有內容都轉換爲'vector',並保持它們的排序。 –

+2

那麼,如果你只是想看看插入迭代器,你實際上不需要'std :: vector',簡單的'std :: inserter(diffSet,diffSet.end())'會完成也是。 –

3

您沒有顯示diffSet的定義,但是如果其名稱爲 表示它是std::set,則不能指定它。迭代器返回的對象的 類型始終爲const。 還有一個問題,您是否存在 指定的元素。如果他們不這樣做(diffSet.size()小於 元素在結果的數量),並且分配了 允許,你有不確定的操作(但可能崩潰);如果 他們這樣做,並分配被允許,修改 的std::set將可能不可侵犯的內部不變 關於訂單的條目。

通常使用的一組功能上分類std::vector, 與輸出的插入迭代器:

std::vector<std::string> tradedSymbols; 
// fill tradedSymbols 
std::sort(tradedSymbols.begin(), tradedSymbols.end()); 
std::vector<std::string> symbols; 
// fill symbols 
std::sort(symbols.begin(), symbols.end()); 

std::vector<std::string> diffs; 
std::set_difference(tradedSymbols.begin(), tradedSymbols.end(), 
        symbols.begin(), symbols.end(), 
        std::back_inserter(diffs)); 

可以使用std ::設置爲好,但你必須將 插入器更改爲std::inserter(diffs, diffs.end())

(注意,代替排序,你可以保持載體插入過程中排序 ,通過使用std::lower_bound找點插入 。如果你在一氣呵成,用 std::sort之後填充它們,但是大概是更有效。)

相關問題