我有整个程序的这个片段。在此功能中,特别是程序的这一部分,用户输入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--;
}
答案 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;
}
)