2013-05-03 42 views
0

我想从这个数组中删除一个名称,然后在数组的最后一个位置删除一个空位。我该怎么做呢?这是我在下面尝试的。它将其删除,但不会移动到最后。如何从阵列中删除元素并将所有元素都移动到某个点上?

const int array_size = 16; 
string restaurants[array_size] = {"Texas Roadhouse","On The Border","Olive Garden","Panda  Express","Cracker Barrel","IHOP","Woohoo","Pei Wei","Mcdonalds","Denny's","Mrs. Fields","Subway","Dairy Queen","Burger King","Pizza Hut","Dominos"}; 
int current_size = 16; 

cout << "Please enter the name of the Restaurant you would like to remove: "; 
cin.ignore(); 
getline(cin, remove_restaurant); 

remove(restaurants, restaurants_size, remove_restaurant);//function call 

bool remove(string restaurants[], int& current_size, string name)//function to remove array 
{ 
    for (int i = 0; i < current_size; i++)//look at each name you want to remove 
    { 
     if (restaurants[i] == name) 
     { 
     restaurants[i]=restaurants[i+1]; 
     current_size --; 
     cout << "Restaurant removed successfully." << endl; 
     return true;    
     } 
    } 
return false; 
} 
+0

使用列表而不是数组。 – 2013-05-03 17:51:13

+2

具体来说,使用STL的std :: list – 2013-05-03 17:52:41

+0

这只是勉强的C++(cout/cin&inline声明)。建议使用STL容器,以使其成为C++解决方案。 – 2013-05-03 18:04:05

回答

2

使用Remove-擦除成语,用std::removestd::fill

bool remove(string restaurants[], int& current_size, string name)//function to remove array 
{ 
    auto begin = std::begin(restaurants); 
    auto end = std::next(begin, current_size); 
    auto new_end = std::remove(begin, end, name); 
    std::fill(new_end, end, {}); 
    current_size = std::distance(begin, new_end); 
    if (new_end != end) { 
     std::cout << "Restaurant removed successfully." << std::endl; 
    } 
    return new_end != end; 
} 
+0

只是出于好奇,你会如何添加“删除成功”的消息呢?检查new_end!=结束?另外,{}初始化程序列表是否需要填充空值?我会简单地使用“”,是更糟? – Sarien 2013-05-03 18:04:32

+0

@Sarien啊,错过了那个副作用。 ''“'原则上效率较低,因为'std :: string'构造函数必须从空字符串中读取(尽管编译器可能会优化它)。 – ecatmur 2013-05-03 18:07:54

2
  1. 创建相同的尺寸与原始
  2. 的阵列开始原始数组的迭代元素
  3. 如果阵列中的当前项不等于项删除,将其添加到新阵列
0

以下是修改当前解决方案的一种可能方法。不过,我同意ott--你应该使用一个列表来代替。

for (int i = 0; i < current_size; i++)//look at each name you want to remove 
{ 
    if (restaurants[i] == name) { 
    swap(restaurants[i], restaurants[current_size-1]); 
    current_size --; 
    cout << "Restaurant removed successfully." << endl; 
    return true; 
    } 
} 
0

随着std::vectorstd::remove,并std::vector::erase

所有的
#include <algorithm> 
#include <string> 
#include <vector> 

// ... 

vector<string> restaurants { ... }; 

string remove_restaurant; 
getline(cin, remove_restaurant); 

restaurants.erase 
    (remove(restaurants.begin(), restaurants.end(), remove_restaurant)); 
0

首先,我认为你宁愿使用这个vectorlist,这就是它被设计为。但是如果你想这样做,你可以例如写一个moveUp方法:

void moveUp(int startIndex, int endIndex, string* array) { 
    for (int ii = startIndex; ii < endIndex; ++ii) { 
     array[ii] = array[ii + 1]; 
    } 

    array[endIndex] = 0; 
}