The first step is to simplify, in this case, remove the input as a potential reason. This indicates that the problem is not caused by the data source. So let's see if the values are saved:
#include <iostream>
#include <string>
#include <set>
struct compare {
bool operator() (const std::string& a, const std::string& b) const{
return a.size() < b.size();
}
};
template<typename T>
void print(const T& t){
for(auto& it : t)
std::cout << it << "\n";
}
template<typename T>
void insert(T& t, const char* value)
{
t.insert(value);
std::cout << "After inserting " << value << "\n";
print(t);
std::cout << "\n";
}
int main() {
std::set<std::string, compare> c;
insert(c, "Apple");
insert(c, "Apricots");
insert(c, "Avocado");
insert(c, "Durian");
insert(c, "Fig");
insert(c, "Tangerine/Clementine");
insert(c, "Kumquat");
insert(c, "Lemon");
insert(c, "Pear");
insert(c, "Prunes");
insert(c, "Raspberries");
insert(c, "Strawberries");
insert(c, "Watermelon");
print(c);
return 0;
}
Values are not saved, but it seems we can return to the problem:
insert(c, "Apple");
insert(c, "Lemon");
http://ideone.com/aGZOIN
std::set::insert , : http://www.cplusplus.com/reference/set/set/insert/
auto result = t.insert(value);
. (1) false (0) .
http://ideone.com/wP4CaG
After inserting Apple. inserted? 1
Apple
After inserting Lemon. inserted? 0
Apple
, . std::set < :
if (!cmp(a, b))
if (!cmp(b, a))
:
struct compare {
bool operator() (const string& a, const string& b) const{
if (a.size() < b.size())
return true;
if (a.size() == b.size() && a.compare(b) < 0)
return true;
return false;
}
};
:
#include <iostream>
#include <string>
#include <set>
struct compare {
bool operator() (const std::string& a, const std::string& b) const{
if (a.size() < b.size())
return true;
if (a.size() == b.size() && a.compare(b) < 0)
return true;
return false;
}
};
template<typename T>
void print(const T& t){
for(auto& it : t)
std::cout << it << "\n";
}
template<typename T>
void insert(T& t, const char* value)
{
auto result = t.insert(value);
std::cout << "After inserting " << value << ". inserted? " << result.second << "\n";
print(t);
std::cout << "\n";
}
int main() {
std::set<std::string, compare> c;
insert(c, "Apple");
insert(c, "Lemon");
insert(c, "Fig");
insert(c, "Kumquat");
print(c);
return 0;
}
http://ideone.com/Vs5p0i
:
After inserting Apple. inserted? 1
Apple
After inserting Lemon. inserted? 1
Apple
Lemon
After inserting Fig. inserted? 1
Fig
Apple
Lemon
After inserting Kumquat. inserted? 1
Fig
Apple
Lemon
Kumquat