如何将map <list <string>,vector <string >>输出到输出文件?

时间:2019-10-12 23:32:48

标签: c++

我正在尝试创建一种简单的机器学习算法,该算法可接收文本主体,将其解析为集合和列表,并从类型为vector的映射中获取上下文,该列表的大小为M,并且然后输出类似于输入文本的正文。当我将映射从类型>切换到上面的类型时,问题就来了,编译器向我抛出一个错误,错误代码很大,而且很长,从我收集的代码中可以看出我做错了什么。 (至少我以为是因为问我今天的日子似乎不太可能)

我输出列表,设置,映射到单独的文件,并且尝试以不同的方式嵌套迭代循环,但是输出看起来都为映射增加了空间。

//context: state is a list<string>, M is currently 2, wordList is my input text which has been parsed, and outputFile is my ofstream.

for (int i = 0; i < M; ++i) {
        state.push_back("");
    }
    for (list<string>::iterator it = wordList.begin(); it != wordList.end(); ++it) {
        wordMap[state].push_back(*it);

//this is the main code that is broken
        outputFile.open(fileMap.c_str());
        for (map<list<string>, vector<string> >::iterator itm = wordMap.begin(); itm != wordMap.end(); ++itm) {
            for (list<string>::iterator itl = itm->first.begin(); itl != itm->first.end(); ++itl) {
                outputFile  << " " << *itl;
            }
            for (vector<string>::iterator itv = itm->second.begin(); itv != itm->second.end(); ++itv) {
                outputFile << ", " << *itv;
            }
            outputFile <<  endl;
        }
        outputFile.close();


        state.push_back(*it);
        state.pop_front();
    }

我希望输出类似于:
我是传奇,快乐,饿,累......
关键是“我是”,其余是添加了标点符号的值。

相反,我得到的是这样的:
我是传奇
我是
我很饿
我累了,渴了,很温暖,要冲我的电脑,...

这是我的编译器给我的错误代码:

error: conversion from ‘std::list<std::basic_string<char> >::const_iterator 
  {aka std::_List_const_iterator<std::basic_string<char> >}’
to non-scalar type ‘std::list<std::basic_string<char> >::iterator
  {aka std::_List_iterator<std::basic_string<char> >}’ requested

for (list<string>::iterator itl = itm->first.begin(); itl != itm->first.end(); ++itl)

1 个答案:

答案 0 :(得分:1)

... conversion from ... const_iterator to ... iterator ... requested

因此,您尝试在const容器上使用iterator而不是const_iterator

这是因为std::map(或任何关联容器)中的键是const。您可以只使用较新的for (auto &ref : container)格式来避免输入所有较长的迭代器类型名称。这样既省力又不易出错。