2014-10-18 142 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