Difficulty in getting iterator upon using find algorithm of STL
-
Hello, Mine is a project in Visual C++, in which I am using STL, and trying to use the "find" algorithm with vectors. But it's giving me the error, error C2678: binary '==' : no operator found which takes a left-hand operand of type 'xyz' (or there is no acceptable conversion), because I have an app class in MFC which has a structure 'xyz' whose only member is a BYTE array. I am trying to get the iterator position by finding a value in a vector of a user-defined type and in return I am getting the above error. Hence a problem. Please help. OR someone can also suggest, which algorithm should I use to get the iterator position of the value I am searching for,from a vector of a user-defined data type (you can suggest that algorithm from the boost library also)? Please help. Thanks in advance. This is urgent. Here is the relevant code snippet to understand the problem: In the header, typedef struct xyz { BYTE byHex[16]; }XYZ; class CMyApp : public CWinApp { ----- ------ public: vector m_vec; ------- -------- DECLARE_MESSAGE_MAP() }; And in the implementation, in .cpp, BYTE byBuff[16] = {0}; vector ::iterator viter; viter = find(theApp.m_vec.begin(), theApp.m_vec.end(), byBuff); And, here this "find" algorithm is giving me problems.
-
Hello, Mine is a project in Visual C++, in which I am using STL, and trying to use the "find" algorithm with vectors. But it's giving me the error, error C2678: binary '==' : no operator found which takes a left-hand operand of type 'xyz' (or there is no acceptable conversion), because I have an app class in MFC which has a structure 'xyz' whose only member is a BYTE array. I am trying to get the iterator position by finding a value in a vector of a user-defined type and in return I am getting the above error. Hence a problem. Please help. OR someone can also suggest, which algorithm should I use to get the iterator position of the value I am searching for,from a vector of a user-defined data type (you can suggest that algorithm from the boost library also)? Please help. Thanks in advance. This is urgent. Here is the relevant code snippet to understand the problem: In the header, typedef struct xyz { BYTE byHex[16]; }XYZ; class CMyApp : public CWinApp { ----- ------ public: vector m_vec; ------- -------- DECLARE_MESSAGE_MAP() }; And in the implementation, in .cpp, BYTE byBuff[16] = {0}; vector ::iterator viter; viter = find(theApp.m_vec.begin(), theApp.m_vec.end(), byBuff); And, here this "find" algorithm is giving me problems.
Implement the equal (==) operator for your
xyz
class and the type on the right side. To get more help you should show us the relevant code (the operation, the structure, and the right side type). To do this edit your initial question to add this information. -
Implement the equal (==) operator for your
xyz
class and the type on the right side. To get more help you should show us the relevant code (the operation, the structure, and the right side type). To do this edit your initial question to add this information.Here is the relevant code snippet: In the header, typedef struct xyz { BYTE byHex[16]; }XYZ; class CMyApp : public CWinApp { ----- ------ public: vector m_vec; ------- -------- DECLARE_MESSAGE_MAP() }; And in the implementation, in .cpp, BYTE byBuff[16] = {0}; vector ::iterator viter; viter = find(theApp.m_vec.begin(), theApp.m_vec.end(), byBuff); And, here this "find" algorithm is giving me problems.
-
Hello, Mine is a project in Visual C++, in which I am using STL, and trying to use the "find" algorithm with vectors. But it's giving me the error, error C2678: binary '==' : no operator found which takes a left-hand operand of type 'xyz' (or there is no acceptable conversion), because I have an app class in MFC which has a structure 'xyz' whose only member is a BYTE array. I am trying to get the iterator position by finding a value in a vector of a user-defined type and in return I am getting the above error. Hence a problem. Please help. OR someone can also suggest, which algorithm should I use to get the iterator position of the value I am searching for,from a vector of a user-defined data type (you can suggest that algorithm from the boost library also)? Please help. Thanks in advance. This is urgent. Here is the relevant code snippet to understand the problem: In the header, typedef struct xyz { BYTE byHex[16]; }XYZ; class CMyApp : public CWinApp { ----- ------ public: vector m_vec; ------- -------- DECLARE_MESSAGE_MAP() }; And in the implementation, in .cpp, BYTE byBuff[16] = {0}; vector ::iterator viter; viter = find(theApp.m_vec.begin(), theApp.m_vec.end(), byBuff); And, here this "find" algorithm is giving me problems.
As already suggested implement the equal operator. This requires changing the
typedef struct
to astruct
(in fact a class):struct xyz
{
BYTE byHex[16];
bool operator==(const xyz& other)
{
return 0 == memcmp(other.byHex, this->byHex, sizeof(this->byHex));
}
bool operator==(const BYTE buf[16])
{
return 0 == memcmp(buf, this->byHex, sizeof(this->byHex));
}
};Then use it as before:
BYTE byBuff[16] = {0};
vector<xyz> m_vec;
vector<xyz> ::iterator viter;
viter = std::find(m_vec.begin(), m_vec.end(), byBuff); -
As already suggested implement the equal operator. This requires changing the
typedef struct
to astruct
(in fact a class):struct xyz
{
BYTE byHex[16];
bool operator==(const xyz& other)
{
return 0 == memcmp(other.byHex, this->byHex, sizeof(this->byHex));
}
bool operator==(const BYTE buf[16])
{
return 0 == memcmp(buf, this->byHex, sizeof(this->byHex));
}
};Then use it as before:
BYTE byBuff[16] = {0};
vector<xyz> m_vec;
vector<xyz> ::iterator viter;
viter = std::find(m_vec.begin(), m_vec.end(), byBuff);Many thanks for this solution, I fully appreciate it. Coincidentally, I had already implemented this, but since this was taking time in checking a database which is huge in size, I was looking for some other algorithm which will give a quicker result. Could you please suggest a better algorithm which will save me from using memcmp?
-
Many thanks for this solution, I fully appreciate it. Coincidentally, I had already implemented this, but since this was taking time in checking a database which is huge in size, I was looking for some other algorithm which will give a quicker result. Could you please suggest a better algorithm which will save me from using memcmp?
Quote:
Could you please suggest a better algorithm which will save me from using memcmp?
Here it is:
struct xyz
{
BYTE byHex[16];
bool operator==(const xyz& other) const { return other.byHex == this->byHex; }
bool operator==(const BYTE buf[16]) const { return buf == this->byHex; }
};But this won't be faster because the compiler will usually generate code that calls
memcmp
internally (or in most cases uses an inline version ofmemcmp
). NOTE: In my initial answer I forgot to make the functionsconst
. -
Quote:
Could you please suggest a better algorithm which will save me from using memcmp?
Here it is:
struct xyz
{
BYTE byHex[16];
bool operator==(const xyz& other) const { return other.byHex == this->byHex; }
bool operator==(const BYTE buf[16]) const { return buf == this->byHex; }
};But this won't be faster because the compiler will usually generate code that calls
memcmp
internally (or in most cases uses an inline version ofmemcmp
). NOTE: In my initial answer I forgot to make the functionsconst
.Hi Jochen, First of all, many thanks for your solution. Although it has solved my operator == overloading question, but I have one more difficulty, may be a strange experience. The find algorithm of STL is not giving the iterator position, even if the item to be searched is located in the BYTE array. Does it have anything to do with the size of the arrays as well? because one BYTE array is of 16 bytes, and the one it is to be compared with is of 33 bytes? In such a case, how can I make the find algorithm give me the correct answer? Please help. Thanks in advance. - Sanjay
-
Hi Jochen, First of all, many thanks for your solution. Although it has solved my operator == overloading question, but I have one more difficulty, may be a strange experience. The find algorithm of STL is not giving the iterator position, even if the item to be searched is located in the BYTE array. Does it have anything to do with the size of the arrays as well? because one BYTE array is of 16 bytes, and the one it is to be compared with is of 33 bytes? In such a case, how can I make the find algorithm give me the correct answer? Please help. Thanks in advance. - Sanjay
std::find
is a function to search for an identical value of a specific type. If you have different types it won't work. This includes arrays of same type but different length. What you are probably looking for is some kind of 'contains' (likestrstr
) or 'begins with' (likememcmp
andstrncmp
with length of searching value) function which you have to implement yourself. Example:for (int i = 0; i < m_vec.size(); i++)
{
if (MySearch(m_vec.at(i), searchValue))
{
// found
break;
}
}