2014-10-18 137 views
0

这是我的第一个问题,我很高兴能成为社区的一员。从阵列中移除元素,然后移动其他元素

我被激发到在这里贴上去除功能的严重问题。我试图删除使用索引和计数关键字我试图从数组中删除元素的条。我在纸上画出了不同的场景,但没有发现明显的模式,所以我不得不在这里问。

比方说,你有 char array[] = {'A','B','C','D','E'}; 我的函数删除了这个原型 void remove(char arr[], int& size, int element, int count)

如果一个人写的,有规模已经宣布,remove(array, size, 2, 2)那么如果打印阵列必须打印ABE。该函数必须转到索引2,然后删除两个元素,然后将其他元素转移。

这里是我想实现的功能:

void remove(char arr[], int& size, int element, int count) { 
for (int i = element; i < count; i++) { 
    arr[element] = arr[element + 1]; 
} 
size = size - count; } 

我可以写,以适应具体的测试用例的功能,但我不能概括它为所有不同的输入工作。我相当肯定size = size - count;是正确的,因为它始终如一地“移除”适当数量的元素,但我不是100%确定的。

如何正确实现此功能?我看到其他人也提出过类似的问题,但不是一次性删除潜在的多个元素。我对矢量的知识也是零,我不认为使用它们可以用于我的其他程序。

+0

就基本上看到了同样的问题昨天: http://stackoverflow.com/q/26434416/103167 – 2014-10-18 18:47:43

+0

哦,我更新;没有什么在这个问题看起来很熟悉:) – RealTimeDouble 2014-10-18 19:07:20

回答

0

您可以通过以下方式使用std::rotate

void remove(char arr[], int& size, int element, int count) { 
    std::rotate(arr + element, arr + element + count, arr + size); 
    size = size - count; 
} 

LIVE DEMO

编辑:

添加请求的检查:

void remove(char arr[], int& size, int element, int count) { 
    if(element < size) { 
    if(count + element > size) count = size - element; 
    std::rotate(arr + element, arr + element + count, arr + size); 
    size = size - count; 
    } 
} 
+0

非常感谢!如果count在正确的范围内,这很好,但我遇到了我在下面提到的同样的问题。如果count大于大小,它应该仍然能够存储数组中的值(打印),如果它从一个非0的索引开始。所以我必须弄清楚如何做到这一点,所以这部分完美实现。 – RealTimeDouble 2014-10-18 18:53:56

+0

我用一个if/else来完美实现它。这工作,但我也需要包括算法。再次感谢。 – RealTimeDouble 2014-10-18 19:00:39

0

您只需要进行一些简单的更改,将元素计数元素前移至当前元素,即arr[element] = arr[element + count];。还要更改for循环以计算最多size - count

+0

我试过这个,它适用于一些情况下,包括我提到的ABE。但是,如果输入大于大小的计数,则会擦除每个元素。如果输入'char arr [] = {'a','b','c'};'和remove(arr,size,2,23);',数组仍然是ab。我应该在其中放置一个if/else以防止它擦除整个事物吗?如果是这样的话会是什么样子? – RealTimeDouble 2014-10-18 18:42:50

+0

只是计数大小 - 在函数的开始处的元素。 – user1937198 2014-10-18 18:44:44