如何使用transform将文件复制到地图?

时间:2015-02-15 11:17:35

标签: c++

我的代码发生了重大变化,因此稍加更新:

练习是读取两个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开头和结尾的参数。将整个文件存储在另一个容器中似乎有点无意义。其次,我不知道要使用什么操作(插入?)。

1 个答案:

答案 0 :(得分:0)

我猜你要找的是istream_iterator。使用这些,您可以将流视为由两个迭代器描述的序列,这是STL样式算法所要求的。

注意:

  • 您的上述代码可能使用std::set代替。
  • 除非之前有内容,否则freq的元素数量(freq.size())与返回的元素数相同。
  • 这个名字暗示&#34;频率&#34;,但这个键值存储的所有值都将为零。
  • 传入指针会产生误导,请改用C ++引用。
  • 如果您确实想要计算出现次数,请使用freq[s]++,因为除非元素已经存在,否则将插入元素。
  • 您永远不会检查文件是否可以打开。