У меня есть простая программа для карт. Он занимает класс в качестве ключа. Класс имеет несколько членов. Я полагаю, что моя функция сравнения верна. Я слежу за строгим слабым порядком. Проблема в том, что она позволяет вводить дубликаты ключей.Карта с ключом класса, позволяет дублировать ключи
Ниже приведен мой код.
#include <iostream>
#include <string.h>
#include <map>
class mapkey
{
public:
std::string mInterface;
std::string mDestination;
int mPrefixLen;
std::string mNextHop;
int mMetric;
mapkey() {}
~mapkey() {}
mapkey(std::string a, std::string b, int c, std::string d, int e)
{
mInterface = a;
mDestination = b;
mPrefixLen = c;
mNextHop = d;
mMetric = e;
}
};
struct mapcomp
{
bool operator() (const mapkey left, const mapkey right);
};
bool mapcomp::operator() (const mapkey left, const mapkey right)
{
if(strcmp(left.mInterface.c_str(), right.mInterface.c_str()) < 0)
return true;
if(strcmp(left.mInterface.c_str(), right.mInterface.c_str()) > 0)
return false;
if(strcmp(left.mDestination.c_str(), right.mDestination.c_str()) < 0)
return true;
if(strcmp(left.mDestination.c_str(), right.mDestination.c_str()) > 0)
return false;
if(strcmp(left.mNextHop.c_str(), right.mNextHop.c_str()) < 0)
return true;
if(strcmp(left.mNextHop.c_str(), right.mNextHop.c_str()) > 0)
return false;
if(left.mPrefixLen < right.mPrefixLen)
return true;
if(left.mPrefixLen > right.mPrefixLen)
return false;
if(left.mMetric < right.mMetric)
return true;
if(left.mMetric > right.mMetric)
return false;
}
typedef std::map<mapkey, std::string, mapcomp> script_map;
script_map mm;
void print_map()
{
script_map::const_iterator iter;
for (iter = mm.begin(); iter != mm.end(); iter++)
{
std::cout << "value is - " << iter->second << std::endl;
}
}
int main()
{
mapkey test1("eth1", "50.60.70.80", 1, "90.10.20.30", 1);
mm[test1] = "first";
mapkey test2("eth1", "50.60.70.40", 1, "90.10.20.30", 1);
mm[test2] = "second";
mapkey test3("eth1", "50.60.70.20", 1, "90.10.20.30", 1);
mm[test3] = "third";
mapkey test4("eth1", "50.60.70.80", 1, "90.10.20.30", 1);
mm[test4] = "fourth";
print_map();
return 0;
}
Выше программы, первая и четвертая клавиши такие же. когда я напечатать карту, выход, как показано ниже
г ++ --std = C++ 11 map.cpp
./a.out
значение - третье значение
является - второе значение
это - четвертое значение
это - первый
Что мне не хватает? Четвертая запись не должна быть добавлена.
Таким образом, ваша функция сравнения не верный. – juanchopanza
Что такое все функции C? ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string) поставляется с [встроенными операторами сравнения] (http://en.cppreference.com/w/cpp/ строка/basic_string/operator_cmp). Вы также можете использовать ['std :: tie'] (http://en.cppreference.com/w/cpp/utility/tuple/tie) – NathanOliver
Ваш компилятор должен был предупредить вас о сравнении, возможно, не возвращая значение , что происходит, если объекты равны. Если бы это произошло, но вы проигнорировали его, прекратите игнорировать предупреждения. – molbdnilo