如何解决我想在C ++中实现map,因为我无法检查向量大小并为我制作的向量提供值
我制作了两个类Node
和Map
,当我尝试在table_size
中获得Map Constructor
并想将所有向量值分配为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> >*> >’ 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> >*> >&’
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>::operator=(std::vector<_Tp,_Alloc>&&) [with _Tp = 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> >*> >&&’
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>::operator=(std::initializer_list<_Tp>) [with _Tp = 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样式数组,并且自size
起没有方法table_size = hash_table.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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。