我正在尝试将我用C编写的旧程序转换为C ++。其中一个部分需要在字典文件中读取,并将每个单词放入仅包含该长度的单词的向量中。所有较小的向量将被放入一个更大的外部向量中。在这个基本的例子中,我试着用几个单词读出并打印出给定大小的单词。当我尝试测试它时,即使文件中存在该大小的单词,也不会打印出任何单词。这段代码有什么问题?
#include <iostream>
#include <fstream>
#include <vector>
#include <stdlib.h>
using namespace std;
vector< vector<string> >readDictionary(void)
{
vector< vector<string> > outer;
vector<string>::iterator iterator;
int letters;
ifstream dict;
for(int i = 0; i < 29; i++)
{
vector<string> inner;
outer.push_back(inner);
}
dict.open("dictionary.txt");
if(!dict.is_open())
{
cout << "Error opening the dictionary. Exiting" << endl;
exit(1);
}
while(!dict.eof())
{
string word;
getline(dict,word);
if(word.size() > 0)
{
vector<string> inner = outer.at(word.size() - 1);
inner.push_back(word);
}
}
cout << "Letters: ";
cin >> letters;
vector<string> inner = outer.at(letters - 1);
for(iterator = inner.begin(); iterator != inner.end(); iterator++)
{
cout << *iterator << endl;
}
return outer;
}
答案 0 :(得分:2)
主要问题是vector::at()
返回对它存储的任何类型对象的引用。但是你没有在'if'语句中使用引用。你的行:
vector<string> inner = outer.at(word.size() - 1);
正在制作所需矢量的副本,然后当该副本超出范围时销毁该副本。
尝试将其替换为:
vector<string>& inner = outer.at(word.size() - 1);
对'for'循环上方的行进行相同的操作。
答案 1 :(得分:1)
简单的拼写错误。你忘了在这一行中使用引用:
vector<string> inner = outer.at(word.size() - 1);
使用代码,它会复制矢量,添加它,然后销毁它。
答案 2 :(得分:0)
只是一个建议,您可以使用map
键,其大小与单词大小相同,并且vector
为string
个,请参阅下面的代码:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <map>
std::map<int, std::vector<std::string>> readDictionary(char const *filename)
{
std::map<int, std::vector<std::string>> out;
std::ifstream dict(filename);
if (!dict.is_open()) throw std::runtime_error("Error opening the dictionary.");
while (!dict.eof()) {
std::string word;
std::getline(dict, word, ' ');
if (!word.empty()) out[word.size()].push_back(word);
}
return out;
}
int main()
{
auto v = readDictionary("dictionary.txt");
for (auto i : v) {
std::cout << "Length " << i.first << ":" << std::endl;
for (auto j : i.second) std::cout << " " << j << std::endl;
}
return 0;
}