2012-07-29 188 views
3

我正在C++中进行练习,我正试图理解如何从列表中移除一个元素,并将其余部分移到左侧。我想知道是否有一个整洁的解决方案。这里是我的版本,似乎做的工作,但我有一种感觉,有一种更好的方法:从C++列表中删除元素

Account AccountList::remove(int i){ 
if(i>=0 && i<size()) { 
    for (int n = i; n < size(); n++) { 
     if(i+1!=size()) { 
      aList[n]=aList[n+1]; 
     } 
    } 
    sz--; 
    return aList[i]; 
} else { 
    return Account(); 
} 
} 

回答

4

你有两个问题在这。

  1. 您没有返回已移除的元素,而是用下一个元素覆盖并返回该元素。我不认为这是你的意图。
  2. 你的循环范围不对。使用此循环,当n = size()时,您将通过索引n + 1的数组边界。1

更正的一个在下面给出。

Account AccountList::remove(int i) 
{ 
    if(i>=0 && i<size()) 
    { 
    Account a = aList[i] 
    for (int n = i; n < size() - 1; n++) 
    { 
     if(i+1!=size()) 
     { 
      aList[n]=aList[n+1]; 
     } 
    } 
    sz--; 
    return a; 
    } else 
    { 
    return Account(); 
    } 
} 
1

如果你这样做,你没有正确地实现列表。列表应具有用于移除元素的复杂度O(1)。这看起来更像是一个数组或向量。

一个列表通常由相互关联的节点组成,在这种情况下,您只需要删除相关节点,并使前一个节点指向要删除的节点之后的节点。

+2

列表不需要是链接列表。使用数组作为后端结构是可以接受的。 – 2012-07-29 18:59:07

+1

即使假设'List'只能表示一个链表(为什么,[skiplist](http://en.wikipedia.org/wiki/Skiplist)或[arraylist](http:// en.wikipedia.org/wiki/Arraylist)?)由于O(n)查找,链表不会因为任意元素而删除O(1)。 – Grizzly 2012-07-29 19:02:56

+0

@Grizzly是的,但我假设你已经有一个指向正在被删除的节点的指针。在这种情况下,它将是'begin()+ n'。 – 2012-07-29 19:03:39