我需要遍歷串列元素并將它們添加到集合中。但是,在串列中移動時,我需要跳過已經添加到集合中的元素。在通過串列移動之前,串列的第一個元素被添加到集合中。
例如:
{“Damir”、“Ana”、“Muhamed”、“Marko”、“Ivan”、“Mirsad”、“Nikolina”、“Alen”、“Jasmina”、“Merima”}
輸入班次:5
米爾薩德
輸入班次:6
穆罕默德
輸入班次:7
安娜
解釋:

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <set>
void Moving_Trough_List(std::vector<std::string>names) {
int n = names.size(), shift = 0;
std::list<std::string>lista;
for (int i = 0; i < n; i ) {
lista.push_back(names[i]);
}
std::set<std::string>team;
auto it = lista.begin();
auto temp = it;
int index_list = 0;
while (shift != -1) {
std::cout << "Enter shift: ";
std::cin >> shift;
std::cin.ignore(100, '\n');
for (int i = 0; i < shift; i ) {
index_list ;
}
if (index_list > n - 1)
index_list = index_list - n 1;
while (it != temp)
it--;
for (int i = 0; i < index_list; i )
it ;
std::cout << *it << "\n";
team.insert(*it);
}
std::cout << std::endl;
for (auto i : team)
std::cout << i << " ";
}
int main ()
{
Moving_Trough_List({"Damir", "Ana", "Muhamed", "Marko", "Ivan",
"Mirsad", "Nikolina", "Alen", "Jasmina", "Merima"
});
return 0;
}
我的輸出:
輸入班次:5
米爾薩德
輸入班次:6
穆罕默德
輸入班次:7
梅里馬
所以它適用于 5 和 6 班,但之后它并沒有跳過已經添加到集合中的元素。你能幫我修改它以跳過已經添加的元素來設定嗎?
uj5u.com熱心網友回復:
跳過團隊成員的最簡單方法是在將條目添加到團隊集時將其從串列中洗掉。然后你總是會跳過它們。只需考慮到串列的大小會發生變化。
uj5u.com熱心網友回復:
這是一種在不丟失串列或改變串列的情況下使用最佳資料結構的方法:
索引的鏈接串列。
鏈表對洗掉節點反應良好。因此,當您移動時,遍歷索引串列,使用存盤在其中的數字索引到名稱串列中。將該名稱添加到集合中并從索引串列中洗掉該節點。根據需要重復。
您需要在輸入之前構建索引串列。它應該與名稱串列一樣長,每個節點都應該索引到名稱串列中的名稱,并且當您洗掉節點時,名稱將變得不可訪問。
請注意:我沒有閱讀您鏈接的“完整任務設定”,馬庫斯聲稱與此處發布的問題相矛盾。
uj5u.com熱心網友回復:
這是一種避免改變任何串列且無需添加新資料結構的方法:
檢查集合中的名稱。
如果該集合包含您已轉移到的名稱,則再次轉移。無需洗掉。
請注意:我沒有閱讀您鏈接的“完整任務設定”,馬庫斯聲稱與此處發布的問題相矛盾。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/477242.html
