我有这个留言板,出售,需要,下面的程序类型。我终于想好了如何把所有的东西都读进去,但需要关于如何比较项目的建议。当我在文件中阅读时,我想检查数组,看看是否有一个想要的项目(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::find
或std::find_if
扫描列表。如果搜索成功,函数将返回一个指向所需项目的迭代器。
删除想要的项目
在迭代器上使用list::erase
。如果你搞砸了,删除无效迭代器的结果是未定义的,但你的运行库很可能会大声告诉你。
和移位
无需。列表长度自行决定。
您还可以考虑使用std::set
进行高效搜索,或者使用std::map<MessageBoard, int>
保持相同元素的计数。
通过使用标准库容器,您可以将逻辑从按位置处理数组元素中提升出来,并使其更接近于匹配消息的问题。您还将编写更少的循环。
如果我可以建议的话,我会把arr
称为board
或messages
。使用名称来传达编译器不知道的含义。另外,atoi在这里有点不合时宜。既然你已经在stringstream
领域,你还不如这样提取价格。
stringstream sw(word);
sw >> arr[index].price;
HTH。