我想在 C++ 中实现 map,为此我无法检查矢量大小并为我制作的矢量提供值



我创建了两个类NodeMap,当我试图在Map Constructor中获取table_size并希望将所有向量值分配为nullptr时,会出现错误。

我的代码在这里这不是过载操作员的问题,我评论了它,我仍然得到错误

#include <iostream>
#include <vector>
template <class T1,class T2>
class Node {
public:
T1 key;
T2 value;
Node* next;
Node(T1 key,T2 value) : key(key) , value(value) , next(nullptr) {};
};
template <class T1,class T2>
class Map {
private:
std::vector<Node<T1,T2>*> hash_table[117];
int table_size;
public:
Map() {
table_size = hash_table.size();
for(int i=0;i<table_size;i++) {
hash_table[i] = nullptr;
}
}
// i assumed that T1 is always string
int stringToHash(T1 key) {
int num = 0;
for(int i=0;i<key.length();i++) {
num += int(key[i]);
}
return ( ( num * 1027 ) % table_size );
}
void put(T1 key,T2 value) {
int idx = stringToHash(key);
Node<T1,T2>* new_node = createNode(key,value);
if(hash_table[idx] == nullptr)
hash_table[idx] = new_node;
else {
Node<T1,T2>* ptr = hash_table[idx];
while(ptr->next != nullptr) {
ptr = ptr->next;
}
ptr->next = new_node;
}
}
T2 operator[] (T1 key) {
int idx = stringToHash(key);
Node<T1,T2>* ptr = hash_table[idx];
T2 value;
while(ptr != nullptr) {
if(ptr->key == key) {
value = ptr->value;
}
ptr = ptr->next;
}
return value;
}
Node<T1,T2>* createNode(T1 key,T2 value) {
Node<T1,T2>* new_node = new Node<T1,T2>(key,value);
return new_node;
}
};
int main() {
Map<std::string,std::string> arr;
return 0;
}

我的错误如下

03_map.cpp: In instantiation of ‘Map<T1, T2>::Map() [with T1 = std::__cxx11::basic_string<char>; T2 = std::__cxx11::basic_string<char>]’:
03_map.cpp:74:34:   required from here
03_map.cpp:21:37: error: request for member ‘size’ in ‘((Map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*)this)->Map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::hash_table’, which is of non-class type ‘std::vector<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*, std::allocator<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*> > [117]’
21 |             table_size = hash_table.size();
|                          ~~~~~~~~~~~^~~~
03_map.cpp:23:31: error: no match for ‘operator=’ (operand types are ‘std::vector<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*, std::allocator<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*> >’ and ‘std::nullptr_t’)
23 |                 hash_table[i] = nullptr;
|                 ~~~~~~~~~~~~~~^~~~~~~~~
In file included from /usr/include/c++/10.2.0/vector:72,
from 03_map.cpp:2:
/usr/include/c++/10.2.0/bits/vector.tcc:198:5: note: candidate: ‘std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const std::vector<_Tp, _Alloc>&) [with _Tp = Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*; _Alloc = std::allocator<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*>]’
198 |     vector<_Tp, _Alloc>::
|     ^~~~~~~~~~~~~~~~~~~
/usr/include/c++/10.2.0/bits/vector.tcc:199:42: note:   no known conversion for argument 1 from ‘std::nullptr_t’ to ‘const std::vector<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*, std::allocator<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*> >&’
199 |     operator=(const vector<_Tp, _Alloc>& __x)
|               ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
In file included from /usr/include/c++/10.2.0/vector:67,
from 03_map.cpp:2:
/usr/include/c++/10.2.0/bits/stl_vector.h:709:7: note: candidate: ‘std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(std::vector<_Tp, _Alloc>&&) [with _Tp = Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*; _Alloc = std::allocator<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*>]’
709 |       operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
|       ^~~~~~~~
/usr/include/c++/10.2.0/bits/stl_vector.h:709:26: note:   no known conversion for argument 1 from ‘std::nullptr_t’ to ‘std::vector<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*, std::allocator<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*> >&&’
709 |       operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
|                 ~~~~~~~~~^~~
/usr/include/c++/10.2.0/bits/stl_vector.h:730:7: note: candidate: ‘std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(std::initializer_list<_Tp>) [with _Tp = Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*; _Alloc = std::allocator<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*>]’
730 |       operator=(initializer_list<value_type> __l)
|       ^~~~~~~~
/usr/include/c++/10.2.0/bits/stl_vector.h:730:46: note:   no known conversion for argument 1 from ‘std::nullptr_t’ to ‘std::initializer_list<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*>’
730 |       operator=(initializer_list<value_type> __l)
|                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~

你能告诉我我做错了什么吗?

这:

std::vector<Node<T1,T2>*> hash_table[117];

不是矢量。这是一个由117个矢量组成的数组。数组没有size()成员。

您的hash_table(std::vector<Node<T1,T2>*> hash_table[117];(是一个c风格的数组,并且在table_size = hash_table.size();导致错误时没有方法size

error: request for member ‘size’ in ‘((Map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*)this)->Map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::hash_table’, which is of non-class type ‘std::vector<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*, std::allocator<Node<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*> > [117]’
21 |             table_size = hash_table.size();

并且hash_table[i] = nullptr;不会工作,因为hash_table[i]引用了std::vector的实例,并且不能是nullptr

你最可能想要的不是std::vector<Node<T1,T2>*> hash_table[117];而是std::array<Node<T1,T2>*, 117> hash_table;,或者如果你想要一个std::vector来调整它的大小,你可以使用std::vector<Node<T1,T2>*> hash_table = std::vector<Node<T1,T2>*>(117);

最新更新