我的代码发生了重大变化,因此稍加更新:
练习是读取两个cpp文件来计算并比较预定义的关键字列表(int,bool等)。目标是学习使用算法库并使用超出基本c或cpp知识的数据结构。
老师建议使用transform在地图中加载keywords.txt。然后读取file1并使用count_if递增所有关键字值。使用count_if和file2递减值。最后检查文件是否相同,几乎相同或可能不同。 (这是一个基本的例子,它没有检查int *等。它更像是一个概念证明练习。)
我最后做的事情有点不同。我将关键字输入到矢量,然后循环遍历该矢量,扫描file1和file2并比较该值。这是较慢的((O)= m * N,因此(o)= N表示小m),但仅使用一个向量进行存储。
代码:
#include <iostream> // std::cin, std::cout
#include <iterator> // std::istream_iterator
#include <fstream> //fin
#include <string> //string
#include <cmath> //abs
#include <algorithm> //count_if, transform
#include <vector> //vector
using namespace std;
int keywordInit(vector<string> &keywords) {
string s;
istream_iterator<string> itEnd;
ifstream fin("keywords.txt");
if (!fin.is_open()){
return -1;
}
istream_iterator<string> s_it(fin);
vector<string>::iterator vec_it = keywords.begin();
insert_iterator<vector<string>> insert_it (keywords,vec_it);
copy(s_it, itEnd, insert_it);
return keywords.size();
}
int main() {
string s;
int AQ = 0;
int temp;
vector<string> keywords;
istream_iterator<string> itEnd;
if (keywordInit(keywords)<1){
cout << "Can't open keywords.txt or it is empty! Press a key to exit." << endl;
cin.get();
cin.get();
return -1;
}
cout << "Geef filenaam 1: ";
cin >> s;
ifstream finA(s); //don't check if I can open file, I know
cout << "Geef filenaam 2: ";
cin >> s;
ifstream finB(s); //don't check if I can open file, I know
for (auto& i : keywords){
finA.clear(); finA.seekg(0);
finB.clear(); finB.seekg(0);
istream_iterator<string> itA(finA);
istream_iterator<string> itB(finB);
temp = abs(count_if(itA, itEnd, [i](string j){return j == i; }) - count_if(itB, itEnd, [i](string j){return j == i; }));
if (temp>1){ //probably not equal, can exit
cout << "Deze programma's zijn hoogstwaarschijnlijk wel origineel." << endl;
cin.get();
cin.get();
return 0;
}
else if (temp == 1){
++AQ;
}
if (AQ>3){ //probably not equal, can exit
cout << "Deze programma's zijn hoogstwaarschijnlijk wel origineel." << endl;
cin.get();
cin.get();
return 0;
}
}
if (AQ){ // closely related
cout << "Deze programma's zijn misschien niet origineel." << endl;
}
else{ // asume copy
cout << "Deze programma's zijn hoogstwaarschijnlijk niet origineel." << endl;
}
cin.get();
cin.get();
return 0;
}
旧帖子:
对于我的作业,我必须使用算法将文本文件中的关键字列表输入到地图中。
没有算法,我有以下解决方案:
int keywordInitFind(map<string,int>* freq) {
string s;
int counter;
ifstream fin("keywords.txt");
while(fin >> s){
if (freq->find(s) == freq->end()){
freq->insert(pair<string,int>(s,0));
++counter;
//DEBUG:
//cout << "Read: " << s << endl;
}
}
return counter; //amount of unique keywords in map
}
首先,我不知道如何给出cin开头和结尾的参数。将整个文件存储在另一个容器中似乎有点无意义。其次,我不知道要使用什么操作(插入?)。
答案 0 :(得分:0)
我猜你要找的是istream_iterator
。使用这些,您可以将流视为由两个迭代器描述的序列,这是STL样式算法所要求的。
注意:
std::set
代替。freq
的元素数量(freq.size()
)与返回的元素数相同。freq[s]++
,因为除非元素已经存在,否则将插入元素。