我是C++的新手。我无法将数据输出到文件。我正在使用迭代器打印出 map 。打印方法采用键值i,然后打印出其对应的 vector 。现在,当我正常使用cout <这是发生错误的我的打印方法:

    public: void print(int i, vector<string> in, ostream& outfile) // print method for printing a vector and it's key
{

    sort(in.begin(), in.end()); // sort the vector alphabetically first

    vector<string>::iterator it;

    it= unique(in.begin(), in.end()); // makes sure there are no duplicate strings

    in.resize( distance(in.begin(),it) );

    for( it = in.begin(); it != in.end(); it++ ) // iterate through it

    cout << i << ": "<< *it<<endl; // and print out the key value and each string in the vector
   // outfile<< i << ":" << *it<< endl; // prints to file
}

最佳答案

您是否同时使用cout行?如果是这样,我想我知道这是什么。

不带括号的for循环将执行下一条语句作为其循环体。如果同时使用cout行和outfile行,则将打印所有内容,然后在循环之后,it将位于数组末尾。然后,您尝试取消引用并将其写入文件,由于您取消引用了无效的迭代器,因此当然会失败。

简短的答案,用大括号将语句包装在for循环中。

例如,您具有以下内容(正确缩进时):

for( it = in.begin(); it != in.end(); it++ ) // iterate through it
    cout << i << ": "<< *it<<endl;
outfile<< i << ":" << *it<< endl; // prints to file

最后一行是it = in.end(),其中in.end()是刚好在 vector 结尾之后的元素。然后,您尝试在不存在(且无效)的位置访问元素,因此失败。相反,您需要将其移动到循环中,该循环应显示为
for( it = in.begin(); it != in.end(); it++ ) // iterate through it
{
    cout << i << ": "<< *it<<endl; // and print out the key value and each string in the vector
    outfile<< i << ":" << *it<< endl; // prints to file
}

10-08 04:16