我需要一些幫助來選擇一個有效的算法,將元素從一個向量放入預分類的桶中 - 或理想地輸出迭代器範圍(因爲它們效率很高)。下面的例子完全是人爲設計的,但想法是使用一個元素的關鍵字來確定輸出存儲區。我不要求如何進行排序,因爲這是簡單地調用一個很簡單的事情(根據其關鍵工程和重新排序元素)使用元素鍵迭代STL容器
std::sort(testVec.begin(), testVec.end(), comparator);
我把live example上coliru,它是非常容易修改和修復(很簡單,或者我不會問這個問題)。我也可以通過這個有序列表中的元素,而鍵值是相同的,將它附加到一個新的桶中,但我正在尋找更像自然界中的STL,現在上面的味道有點像最後的解決辦法,最終的解決方案也需要高效,因爲testVec可能很大,而且對象也很大。我不想修改testvec - 所以它應該是不可變的。
理想情況下,我正在尋找某種類型的構造,吐出範圍迭代器或類似效率的東西。實際的對象很大,所以傳遞引用或移動它們是唯一的選擇 - 我的實際對象(相當於MyStr)是可移動的。某種關鍵的foreach,應用關鍵謂詞或者我找不到的是我正在尋找的東西。我硬編碼下面的3個桶,以顯示我需要達到什麼 - 這完全是一種破解。
預先感謝這個問題
#include <string>
#include <iostream>
#include <sstream>
#include <iterator>
#include <vector>
#include <algorithm>
struct MyStr
{
int key;
std::string strval;
MyStr(int key, const std::string& rStrVal)
: key(key)
, strval(rStrVal)
{}
// let stream operators be friend functions instead of members!
inline friend std::ostream& operator << (std::ostream& os, const MyStr& val) {
os << "key[" << val.key << "], strval['" << val.strval << "']";
return os;
}
bool operator < (const MyStr& str) const {
return (key > str.key);
}
};
int main()
{
std::vector <MyStr> testVec = {
MyStr(4, "key 4"),
MyStr(3, "key 3"),
MyStr(3, "key 3"),
MyStr(2, "key 2"),
MyStr(2, "key 2"),
MyStr(2, "key 2")
};
//auto comparator = [](const MyStr& lhs, const MyStr& rhs) {
// return lhs.key < rhs.key;
//};
std::vector <MyStr> foursBucket;
std::vector <MyStr> threesBucket;
std::vector <MyStr> twosBucket;
auto ostriter = std::ostream_iterator<MyStr>(std::cout, ",");
std::for_each(testVec.begin(), testVec.end(),
[&](const MyStr& next){
switch (next.key) {
case 4:
foursBucket.push_back(next);
break;
case 3:
threesBucket.push_back(next);
break;
case 2:
twosBucket.push_back(next);
break;
}
});
std::cout << "Elements with Key Value 2" << std::endl;
std::copy(twosBucket.begin(), twosBucket.end(), ostriter);
std::cout << std::endl;
std::cout << "Elements with Key Value 3" << std::endl;
std::copy(threesBucket.begin(), threesBucket.end(), ostriter);
std::cout << std::endl;
std::cout << "Elements with Key Value 4" << std::endl;
std::copy(foursBucket.begin(), foursBucket.end(), ostriter);
std::cout << std::endl;
}
任何幫助,將產生以下輸出
Elements with Key Value 2
key[2], strval['key 2'],key[2], strval['key 2'],key[2], strval['key 2'],
Elements with Key Value 3
key[3], strval['key 3'],key[3], strval['key 3'],
Elements with Key Value 4
key[4], strval['key 4'],
正如你所看到的結構非常簡單,我展示瞭如何我可以現在排序使用謂詞的對象,但我不知道選擇哪種算法來高效迭代
難道你只是在尋找像'std :: multiset'這樣的東西?它將是一個容器,存儲將不會持續,但如果您只需存儲迭代器範圍,我不明白您需要哪些容器。 – pmr
我需要能夠分別處理這些單獨的範圍 - 這就是爲什麼我有單獨的桶。理想情況下,如果我可以調用一些具有輸入範圍作爲參數的魔術謂詞-r lambda函數,那麼我會完成這個想法,preducate將被調用多次,因爲有獨特的鍵 – johnco3