在同时添加和删除匹配项的同时比较数组中的项



我有这个留言板,出售,需要,下面的程序类型。我终于想好了如何把所有的东西都读进去,但需要关于如何比较项目的建议。当我在文件中阅读时,我想检查数组,看看是否有一个想要的项目(true),并计算数组中已经存在的待售项目的名称。如果找到匹配项,请不要添加该项,并从数组中删除所需项,然后移位。

#include <iostream>
#include <sstream>
#include <fstream>
#include <cstdlib>
#include <list>

using namespace std;
struct messageBoard {
string item;
bool forSale;
int price;
};

int main(){
messageBoard board;
const int arrayLength = 100;
std::list<messageBoard> arr;
int index = 0;
string filename;
ifstream words;
cout<<"Please enter the filename:";
cin>>filename;
words.open(filename);
if (words.fail()) {
cout << "file not found or something" << endl;
}else {
string word;;
while (getline(words, word)) {
int wordIndex = 0;
stringstream ss;
ss << word;
while (getline(ss, word, ',')){
if (wordIndex==0){
board.item = word;
}
else if (wordIndex==1&&word==" for sale"){
board.forSale = false;
}
else if (wordIndex==1&&word==" wanted"){
board.forSale = true;
}
else if (wordIndex==2){
board.price = atoi(word.c_str());
}
wordIndex++;

}
index ++;
arr.push_back(board);

}
}
words.close();
for(std::list<messageBoard>::iterator it = arr.begin(); it != arr.end();    it++) {
std::cout << "item: " << (it)->item << " bool: " << (it)->forSale    <<"Price: "<<(it)->price << std::endl;

}

}

我不会为您编写代码,但我会告诉您如何处理这个问题。

首先,我将arr重新定义为

std::list<MessageBoard> arr;

要将元素添加到列表中,请使用list::push_back

如果需要的项(true)与数组中已存在的项的名称匹配

编写一个bool函数,如果满足这些条件,则返回true,否则返回false。

使用您的功能,使用std::findstd::find_if扫描列表。如果搜索成功,函数将返回一个指向所需项目的迭代器。

删除想要的项目

在迭代器上使用list::erase。如果你搞砸了,删除无效迭代器的结果是未定义的,但你的运行库很可能会大声告诉你。

和移位

无需。列表长度自行决定。

您还可以考虑使用std::set进行高效搜索,或者使用std::map<MessageBoard, int>保持相同元素的计数。

通过使用标准库容器,您可以将逻辑从按位置处理数组元素中提升出来,并使其更接近于匹配消息的问题。您还将编写更少的循环。

如果我可以建议的话,我会把arr称为boardmessages。使用名称来传达编译器不知道的含义。另外,atoi在这里有点不合时宜。既然你已经在stringstream领域,你还不如这样提取价格。

stringstream sw(word);
sw >> arr[index].price;

HTH。

相关内容

  • 没有找到相关文章