我在打印列表数组时遇到问题(例如list<string> hashTable[100]
)
到目前为止,我的问题是,我的问题在底部:
hash2.h
1 #ifndef __HASH2_H
2 #define __HASH2_H
3
4 #include<string>
5 #include<list>
6 #include<fstream>
7
8 using namespace std;
9
10 class Hash
11 {
12 public:
13 void processFile(string fileName);
14 void print();
15
16 private:
17 list<string> hashTable[100];
18
19 private:
20 int hf(string ins);
21
22
23 };
24
25 #endif
hash_function2.cpp
1 #include<iostream>
2 #include<string>
3 #include<fstream>
4 #include "hash2.h"
5
6 using namespace std;
7
8 void Hash::processFile(string fileName)
9 {
10 string word;
11 ifstream myIfile(fileName.c_str());
12 while(getline(myIfile, word))
13 {
14 int index = hf(word);
15 hashTable[index].push_back(word);
16 }
17 myIfile.close();
18 }
19
20 void Hash::print()
21 {
22 for(int i = 0; i < 100; i++)
23 {
24 if(hashTable[i] != NULL)
25 {
26 list<int>::iterator i;
27 for(i = hashTable[i].begin(); i != hashTable[i].end(); ++i)
28 {
29 cout << *i << endl;
30 }
31 }
32 }
33 }
34
35 int Hash::hf(string ins)
36 {
37 return ( (int) ins[0] ) % 100;
38 }
main2.cpp
1 #include "hash2.h"
2 #include<iostream>
3 #include<iomanip>
4 #include<fstream>
5
6 using namespace std;
7
8 int main()
9 {
10 Hash hashTable;
11 hashTable.processFile("test1.txt");
12 hashTable.print();
13 }
所以,我现在拥有的是processFile函数,它接受文本文件,读取每个单词,执行散列函数(糟糕,我知道),然后将该单词放入散列函数返回的数组索引中。我觉得这很好用。
我遇到的问题主要是使用STL列表。所以,在hash_function2.cpp中,我想打印我的哈希表。我不知道如何检查数组索引是否为空(没有我存储的任何单词),我也不确定如何在给定的数组索引处打印列表中的所有字符串。基本上我想做的就是打印我的哈希表;让我的print()函数正常工作。
如果有人能指出我正确的方向,那就太棒了!非常感谢。
答案 0 :(得分:1)
您不应该检查NULL
,因为您有一组std::list
个对象,而不是指针。
您可以检查索引i
的列表是否包含以下内容:
if (!hashTable[i].empty())
{
// there are elements in the list
}
或者
if (hashTable[i].size())
{
// there are elements in the list
}
同样在print()
函数中,您使用的是std::list<int>
类型的迭代器,但它应该是std::list<string>
,它与hashTable
的声明匹配。
答案 1 :(得分:0)
您的问题不在于标准列表,而在于数组。
您可以尝试使用std::array
#include <array>
std::array< std::list<string>, 100> hashTable;
这样你可以检查它是否是emtpy
if (!hashTable.empty())
{
// do stuff
}
在里面你可以检查每个列表
if(!hashTable[i].empty())
{
// do even more stuff
}
答案 2 :(得分:0)
太棒了,非常感谢!我理解如何检查每个数组索引并遍历列表!继承人我做了什么:
1 #include "hash2.h"
2
3 #include<iostream>
4 #include<string>
5 #include<fstream>
6
7 using namespace std;
8
9 void Hash::processFile(string fileName)
10 {
11 string word;
12 ifstream myIfile(fileName.c_str());
13 while(getline(myIfile, word))
14 {
15 int index = hf(word);
16 hashTable[index].push_back(word);
17 }
18 myIfile.close();
19 }
20
21 void Hash::print()
22 {
23 for(int i = 0; i < 100; i++)
24 {
25 if(hashTable[i].empty() != true)
26 {
27 list<string>::iterator r;
28 for(r = hashTable[i].begin(); r != hashTable[i].end(); ++r)
29 {
30 cout << *r << endl;
31 }
32 }
33 }
34 }
35
36 int Hash::hf(string ins)
37 {
38 return ( (int) ins[0] ) % 100;
39 }