проблема с манипуляцией итератором - PullRequest
0 голосов
/ 04 марта 2010

У меня есть std :: map, и я использую итератор, чтобы найти определенный ключ, пару значений. После нахождения я не могу получить положение ключа, пары значений от итератора. Сделав еще одну находку, я смогу ее получить, но я хочу обойти это.

//mycode is this

std::map<std::string,myclass*> mymap;

size_t myfind(const std::string &s)
{

std::map<std:string,myclass*>::iterator i=mymap.find(s);

if((i==mymap.end())||((*i).second==0))
{
std::cout<<"some error\n";
}

else
{
//here i need to return the size_t value of the iterator i
}

}

ПРИМЕЧАНИЕ: отредактировал size_t в качестве позиции ключа, пары значений

Ответы [ 2 ]

3 голосов
/ 04 марта 2010

Если вы хотите вернуть «позицию» результата:

#include <iterator>
// ...

std::map<std::string,myclass*> mymap;

size_t myfind(const std::string &s)
{

    std::map<std:string,myclass*>::iterator i=mymap.find(s);

    if((i==mymap.end())||((*i).second==0))
    {
        std::cout<<"some error\n";
    }

    else
    {
        return std::distance(mymap.begin(), i);
    }
}

Однако вам, вероятно, лучше просто вернуть итератор!

0 голосов
/ 04 марта 2010

Какое отношение имеет size_t к чему-либо? Вы нашли пару ключ-значение, ключ - строка, значение - указатель на некоторый класс. Вот и все. Какую size_t ценность вы имели в виду?

Некоторый фон, чтобы поставить вас на правильный путь: карта и набор в STL обычно реализуются как сбалансированное двоичное дерево (красно-черное дерево). Каждый узел в дереве имеет значение (просто ключ для набора или пара для карты, ) и два указателя на дочерние узлы. Вы можете рассматривать map::iterator как указатель на узел с причудливыми перегруженными операторами, так что, скажем, увеличение значения итератора перемещает указатель на следующий узел в порядке сортировки. Так что нет "size_t значения итератора". Это экземпляр класса, который переносит указатель на узел двоичного дерева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...