在struct unsorted数组中将索引移到左侧

时间:2013-04-03 03:21:36

标签: c++ arrays struct

我有整个程序的这个片段。在此功能中,特别是程序的这一部分,用户输入MLS#,用于从阵列中删除的主页。第一个“for”语句搜索MLS#,然后查找null的所有数据。我在接下来遇到问题 “for”声明。在索引被清零后将所有数据移动到左侧。存储在struct数组中的数据如下:

struct mlsListing { int mlsNum;           // Struct Array holds one line of the struct
                    double price;         // mlsListing 
                    int type; 
                    string zip; 
                    string company; 
                    string realty; 
                  }; 
 const int MAX_LISTINGS = 750;  
        mlsListing houseData[MAX_LISTINGS]; 
 const int NOT_FOUND = -1;
 int targetMLS; // Variable for target MLS
 int mlsDelete; // Variable for target MLS found
 int mlsCounter;// Counter for finding target MLS 
 int count;     // Array Counter


// Function 

void {

 cout << "Enter the MLS# you wish to delete: "; 
           cin >> targetMLS;                       // User input MLS#


        for (mlsCounter = 0; ((mlsCounter < count) && (mlsDelete == NOT_FOUND));
                                 mlsCounter++) {

                 if (houseData[mlsCounter].mlsNum == targetMLS) {

                    mlsDelete = houseData[mlsCounter].mlsNum; 

                    houseData[mlsCounter].mlsNum = 0; 
                    houseData[mlsCounter].price = 0;
                    houseData[mlsCounter].type = 0;
                    houseData[mlsCounter].zip.clear(); 
                    houseData[mlsCounter].company.clear();
                    houseData[mlsCounter].realty.clear(); 
                  }
          }


         // Shifting indices to the left after deletion?

          for (move = mlsCounter;move < count; move++){

              houseData[move].mlsNum = houseData[move+1].mlsNum; 
              houseData[move].price = houseData[move+1].price; 
              houseData[move].type = houseData[move+1].type; 
              houseData[move].zip = houseData[move+1].zip; 
              houseData[move].company = houseData[move+1].company;
              houseData[move].realty = houseData[move+1].realty;  
          } 

         count--; 
}

3 个答案:

答案 0 :(得分:2)

第二个for循环超出范围。必须是:

for (move = mlsCounter;move < count - 1; move++)

答案 1 :(得分:0)

正在做的是从数组中的位置移除该项目,方法是浏览所有剩余的项目并将它们移近一点(然后在最后递减计数。)

简化示例:

假设你有一个只包含字符的更简单的数组。我们有一个包含10个字符的数组:

Array position :   [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]
Values in array:    a    l    p    h    a    b    e    t    i    c

你如何删除位置[5]中的字母(即'b')?你将所有剩余的字母移过来,所以它看起来像这样:

Array position :   [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]
Values in array:    a    l    p    h    a    e    t    i    c    

这正是你看到的for循环正在做的事情。它正在对结构的每个部分进行,有效地将下一个索引中的结构的所有部分复制到前一个部分。

如果我没记错的话,这对结构来说是不必要的。我相信你应该只能说houseData[move] = houseData[move+1],它只会按顺序将后者复制到前者中。

修改

根据评论/讨论,问题不同。你只需要在正确的时间突破你的上层循环。您还需要将第二个循环设置为不超出范围。

for (mlsCounter = 0; ((mlsCounter < count) && (mlsDelete == NOT_FOUND));
                             mlsCounter++) {

             if (houseData[mlsCounter].mlsNum == targetMLS) {

                mlsDelete = houseData[mlsCounter].mlsNum; 

                houseData[mlsCounter].mlsNum = 0; 
                houseData[mlsCounter].price = 0;
                houseData[mlsCounter].type = 0;
                houseData[mlsCounter].zip.clear(); 
                houseData[mlsCounter].company.clear();
                houseData[mlsCounter].realty.clear(); 

                break;
              }
      }

   for (move = mlsCounter;move < count - 1; move++){

答案 2 :(得分:0)

我认为列表对于该任务来说是更适合的数据结构。另外,在任何情况下,如果可能,您应该考虑使用标准库提供的容器。

std::list<mlsListing> housedata; // so you can easily add stuff at the end, and remove stuff in the middle at low cost

std::remove_if( housedata.begin(), housedata.end(), 
                [&](mlsListing current) -> bool 
                {
                    if (current.mlsNum == targetMLS)
                    {
                        mlsDelete = current.mlsNum;
                        return true;
                    }
                    return false;
                }
              )