http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51538
Bug #: 51538
Summary: std::set::insert(InputIterator first, InputIterator
last) makes set uniterable
Classification: Unclassified
Product: gcc
Version: 4.6.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
AssignedTo: [email protected]
ReportedBy: [email protected]
Here source exaple:
//////////////////////////////////////////////////
#include <set>
#include <cstdlib>
#include <cstdio>
#include <cstdlib>
typedef char FOO[8];
void randomFOO(FOO * uidl)
{
for(int i = 0; i < sizeof(uidl); ++i)
{
unsigned char byte = rand() * 256 / RAND_MAX;
*((char*)uidl + i) = byte;
}
}
struct FOOwrapper
{
FOOwrapper(const FOO * uidl)
{
memcpy(&m_uidl, uidl, sizeof(FOO));
}
FOOwrapper(const FOOwrapper & othr)
{
memcpy(&m_uidl, &othr.m_uidl, sizeof(FOO));
}
const FOOwrapper & operator=(const FOOwrapper & othr)
{
memcpy(&m_uidl, &othr.m_uidl, sizeof(FOO));
return *this;
}
bool operator<(const FOOwrapper & othr) const
{
return memcmp(&m_uidl, &othr.m_uidl, sizeof(FOO));
}
FOO m_uidl;
};
std::set<FOOwrapper> fooset;
static const int size = 5;
//#define SIMPLE_INSERT
int main(int argc, char *argv[])
{
FOOwrapper * wrap = static_cast<FOOwrapper
*>(malloc(size*sizeof(FOOwrapper)));
for(int i = 0; i < size; ++i)
{
FOO uidl;
randomFOO(&uidl);
new (wrap + i) FOOwrapper(&uidl);
#ifdef SIMPLE_INSERT
fooset.insert(wrap[i]);
#endif
}
#ifndef SIMPLE_INSERT
fooset.insert(wrap, wrap + size);
#endif
printf("size: %d\n\n", fooset.size());
std::set<FOOwrapper>::const_iterator it = fooset.begin();
for(int i = 0; it != fooset.end(); ++it,++i)
printf("%d\n", i);
free(wrap);
return 0;
}
//////////////////////////////////////////////////
if SIMPLE_INSERT is not defined then output will be:
size: <value of variable size>
0
1
No matter how many elements being inserted output always is the same. In other
words we are limited to iterating only trough 2 elements.
if SIMPLE_INSERT is defined, ie used std::set::insert(const value_type& x)
method, then iterating through collection is proper.
This source code, compiled with VSC++ 2010 works fine in both cases.