遍历列表元素
Moving through list elements
我需要遍历列表元素并将它们添加到集合中。但是,在列表中移动时,我需要跳过已经添加到集合中的元素。在遍历列表之前将列表的第一个元素添加到集合中。
例如:
{"Damir", "Ana", "Muhamed", "Marko", "Ivan","Mirsad", "Nikolina", "Alen", "Jasmina",
“梅里玛”}
Enter shift: 5
Mirsad
Enter shift: 6
Muhammed
Enter shift: 7
Ana
解释:
#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;
}
我的输出:
Enter shift: 5
Mirsad
Enter shift: 6
Muhammed
Enter shift: 7
Merima
所以它在第 5 班和第 6 班正常工作,但之后它没有跳过已经添加到集合中的元素。你能帮我修改这个以跳过已经添加的元素来设置吗?
跳过团队成员的最简单方法是在将条目添加到 team-set 时将其从列表中删除。那么你将永远跳过它们。请考虑到您的列表大小会发生变化。
这里有一种使用最佳数据结构的方法,既不会丢失列表也不会改变它:
索引链表。
链接列表对删除节点反应良好。因此,当您移动时,遍历索引列表,使用存储在其中的数字索引到名称列表中。将该名称添加到集合中并从索引列表中删除该节点。根据需要重复。
您需要在接受输入之前构建索引列表。它应该与名称列表一样长,每个节点应该索引到名称列表中的一个名称,并且当您删除节点时,名称将变得不可访问。
请注意:我没有阅读您链接的“完整任务设置”,Marcus 声称与此处发布的问题相矛盾。
这是一种避免改变任何列表且无需添加新数据结构的方法:
检查集合中的名称。
如果该集合包含您已转移到的名称,请再次转移。无需删除。
请注意:我没有阅读您链接的“完整任务设置”,Marcus 声称与此处发布的问题相矛盾。
我需要遍历列表元素并将它们添加到集合中。但是,在列表中移动时,我需要跳过已经添加到集合中的元素。在遍历列表之前将列表的第一个元素添加到集合中。
例如:
{"Damir", "Ana", "Muhamed", "Marko", "Ivan","Mirsad", "Nikolina", "Alen", "Jasmina", “梅里玛”}
Enter shift: 5
Mirsad
Enter shift: 6
Muhammed
Enter shift: 7
Ana
解释:
#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;
}
我的输出:
Enter shift: 5
Mirsad
Enter shift: 6
Muhammed
Enter shift: 7
Merima
所以它在第 5 班和第 6 班正常工作,但之后它没有跳过已经添加到集合中的元素。你能帮我修改这个以跳过已经添加的元素来设置吗?
跳过团队成员的最简单方法是在将条目添加到 team-set 时将其从列表中删除。那么你将永远跳过它们。请考虑到您的列表大小会发生变化。
这里有一种使用最佳数据结构的方法,既不会丢失列表也不会改变它:
索引链表。
链接列表对删除节点反应良好。因此,当您移动时,遍历索引列表,使用存储在其中的数字索引到名称列表中。将该名称添加到集合中并从索引列表中删除该节点。根据需要重复。
您需要在接受输入之前构建索引列表。它应该与名称列表一样长,每个节点应该索引到名称列表中的一个名称,并且当您删除节点时,名称将变得不可访问。
请注意:我没有阅读您链接的“完整任务设置”,Marcus 声称与此处发布的问题相矛盾。
这是一种避免改变任何列表且无需添加新数据结构的方法:
检查集合中的名称。
如果该集合包含您已转移到的名称,请再次转移。无需删除。
请注意:我没有阅读您链接的“完整任务设置”,Marcus 声称与此处发布的问题相矛盾。