遍历列表元素

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 声称与此处发布的问题相矛盾。