std::map
делает его ключи неизменяемыми, поэтому ссылки на изменяемые версии его ключей невозможны без нарушения const
-корректности.Если вы уверены, что эта версия карты, в которой вы выполняете поиск по значению, верна, то вам нужно будет свернуть свою собственную структуру данных, чтобы этот код работал.
В качестве альтернативы, поскольку у меня возникли трудностиполагая, что это на самом деле правильная версия вашей программы, учтите следующее: во всех случаях, когда вы ищите значения в edges
, вы ищете std::string
, связанный с двумя Tnode
объектами.Кажется довольно ясным, что правильная структура данных для этого кода не std::map<Tedge, std::pair<Tnode, Tnode>>
, а std::map<std::pair<Tnode, Tnode>, Tedge>
.Tnode
в этом случае представляет половину ключа, ищущего объект Tedge
, как вы его используете.
Кроме того, вы не можете вернуть nullptr
для ссылок.Вам нужно либо сгенерировать исключение, либо предоставить какую-то обработку для представления сценария, в котором вы не можете вернуть объект.
void add(Tnode n, Tnode n2, Tedge e) {
edges.insert(std::make_pair(std::make_pair(n, n2), e));
}
bool has(Tedge edge) const{
bool l = false;
for(typename std::map<Tedge, std::pair<Tnode, Tnode>>::const_iterator it = edges.begin(); it != edges.end() && !l; it++) {
l = it -> second == edge;
}
return l;
}
const Tedge operator()(const Tnode &first, const Tnode &sec) const {
std::map<std::pair<Tnode, Tnode>, Tedge>::const_iterator it = edges.find(std::pair<Tnode, Tnode>(first, sec));
if(it != edges.end())
return it-> second;
else
throw std::runtime_error("No such element found");
}
Tedge & operator()(const Tnode &first, const Tnode &sec) {
std::map<std::pair<Tnode, Tnode>, Tedge>::iterator it = edges.find(std::pair<Tnode, Tnode>(first, sec));
if(it != edges.end())
return it-> second;
else
throw std::runtime_error("No such element found");
}
Я не знаю, почему у вас есть ограничение на пребывание вПодмножество C ++ 98 (если это ограничение наложено вашим профессором, значит, ваш профессор не очень хорош в своей работе, я думаю), но если это ограничение можно снять, то вы можете значительно упростить этот код:
void add(Tnode n, Tnode n2, Tedge e) {
edges.emplace(std::make_pair(n, n2), e);
}
bool has(Tedge const& edge) const{
for(auto const& entry : edges)
if(entry.second == edge)
return true;
return false;
}
const Tedge operator()(const Tnode &first, const Tnode &sec) const {
if(auto it = edges.find(std::make_pair(first, sec)); it != edges.end())
return it->second;
else
throw std::runtime_error("No such element found");
}
Tedge & operator()(const Tnode &first, const Tnode &sec) {
if(auto it = edges.find(std::make_pair(first, sec)); it != edges.end())
return it->second;
else
throw std::runtime_error("No such element found");
}