2016-06-26 75 views
-2

我有以下設置:避免套迭代器和載體

 auto comp = [](const vector<int>& a, const vector<int>& b) -> bool 
    { return a.size() < b.size(); }; 
    auto path = std::set <vector<int>, decltype(comp)> (comp); 

當我嘗試從組任務

tasks.begin() this will return an iterator of the set 

也得到了第一個元素,當我再次嘗試訪問該集合的向量:

tasks.begin()->begin() this will only return an iterator of the vector. 

如何獲取該集合的第一個元素而沒有任何迭代器?

+0

'std :: set tasks;' - 那對你有用? – LogicStuff

+0

忘記了最後>編輯。 – user2524707

+0

它將如何排序? – LogicStuff

回答

1

你不能。訪問std::set中元素的唯一方式是通過以下方法:begin,end,cbegin,cend,rbegin,rend,crbegin,crend,insert,emplace,emplace_hint,erase,find,equal_range,lower_bound和upper_bound。它們中的每一個都會返回一個迭代器,一對迭代器或一對迭代器和一個布爾。

+0

有沒有一種方法可以將集合中的第一個向量(最小尺寸的向量)分配給另一個向量? – user2524707

+0

@ user2524707:您可以擦除最小的矢量,然後插入另一個矢量。即tasks.erase(tasks.begin()); tasks.insert(some_vector);' - 你不能直接修改'std :: set'元素,因爲這樣做可能會破壞集合的不變性。 –

+0

我想要其他方式。從集合中刪除矢量並將其分配給某個矢量。 – user2524707

1

我不確定你想要做什麼,但它是濫用比較。以下是requirements on a compare type T

類型T滿足比較如果

  • 類型T滿足BinaryPredicate,和

鑑於

  • comp,類型的對象進行比較
  • equiv(a, b),表達相當於!comp(a, b) && !comp(b, a)

如果你的函數不檢查兩個和它們的順序相對返還給對方,違反本合同,其結果將是不確定的。

+0

我想根據矢量的大小來排序。 – user2524707

+0

他的比較函數滿足要求就好了。 –

+0

@ user2524707然後,你已經有了什麼將會正常工作。混淆的根源是你的陳述:「如何在沒有任何迭代器的情況下獲得該集合的第一個元素?」答案是你不應該在你的比較中得到這個結果。 –