1

我正在尝试使用链表实现来修改另一个链表。这是我正在尝试做的一个例子。

list<int>list1;
list<int>list2;

list1.push_back( 1 );   // < --- want to modify this list
list1.push_back( 2 );

list2.push_back( 1 );   // with this list

简而言之,我想使用 list2 作为一种变量来修改 list1。我做了一些研究,好像我无法像数组一样访问列表的节点。是否有一个容器可以让我轻松地添加和删除节点并与其他容器进行比较和修改?我在想集合可能是一种选择,但似乎我也无法访问集合中的值。任何帮助或证据都会很棒。提前致谢。

编辑:::

我正在寻找创建一个数独求解器。我将所有 81 位数字(空白和给定)放入“链表”中。我现在希望从代表 1 个单元格的每个“列表”中删除可能的候选人。

例如listlist1;列表列表2;

list1.push_back( 1 );  
list1.push_back( 2 );

list2.push_back( 1 );   

我现在想像这样使用 list2

list1.remove( list2(?) );  // < -- this obviously isn't possible due to how nodes are stored.

我希望这能澄清我的问题。这是我用来解决简单数独的方法,稍后我将实施蛮力技术。

4

3 回答 3

1

我不知道你用另一个修改容器的想法是什么,也许你的意思是参考。将其用作参考变量:

list<int> list1;
list<int>& list2 = list1;

list2.push_back(1); //<--- modifies list1

或使用指针:

list<int> list1;
list<int>* list2 = &list1;

list2->push_back(1); //<--- modifies list1

在此处阅读有关指针的信息

于 2012-10-24T06:31:42.873 回答
0

这是一种方式,毫无疑问还有其他方式。这确实取决于您的具体情况。例如,如果您的列表已排序,则有比这更好的方法。

list<int> list1 = ...;
list<int> list2 = ...;
for (list<int>::const_iterator i = list2.begin(); i != list2.end(); ++i)
  list1.remove(*i);
于 2012-10-24T06:53:17.423 回答
0

由于您的列表不会太长,我认为使用list::remove_if()是您最好的选择。

使用辅助功能:

bool IsInList2(int el)
{
  return std::find(list2.begin(), list2.end(), el) != list2.end();
}

并在您的代码中使用它:

list1.remove_if(&IsInList2);
于 2012-10-24T06:56:13.580 回答