मैंने दो वर्ग Node
और Map
बनाए, जब मैं 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)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
क्या आप मुझे बता सकते हैं कि मैंने क्या गलत किया?
2 जवाब
आपका 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);
का उपयोग करेंगे
इस:
std::vector<Node<T1,T2>*> hash_table[117];
वेक्टर नहीं है। यह 117 वैक्टर की एक सरणी है। Arrays में size()
सदस्य नहीं है।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।