Вернуть итератор легко. Например, вы можете вернуть первый итератор в векторных типах:
std::vector<std::string> types;
// some code here
std::vector<std::string>::iterator Union::returnTheBeginIterator()
{
return types.begin();
}
Java против C ++
Но итераторы C ++ не являются итераторами Java: они не используются одинаково.
В Java (IIRC) вы больше похожи на перечислитель, то есть вы используете метод «next» для перехода от одного элемента к следующему. Таким образом, возвращения Java-итератора достаточно для итерации от начала до конца.
В C ++ итератор спроектирован так, чтобы вести себя как супер-указатель. Таким образом, он обычно «указывает» на значение, и, используя операторы ++, - и т. Д. (В зависимости от точного типа итератора), вы можете переместить итератор в «точку» на следующий, предыдущий и т. Д. . значение в контейнере.
Давайте повторим!
Обычно вы хотите выполнить итерацию от начала до конца.
Для этого вам нужно вернуть либо всю коллекцию (как "const", если вы хотите, чтобы она была только для чтения), и позволить пользователю выполнять итерацию так, как он хочет.
Или вы можете вернуть два итератора, один для начала и один для конца. Таким образом, вы могли бы иметь:
std::vector<std::string>::iterator Union::typesBegin()
{
return types.begin();
}
std::vector<std::string>::iterator Union::typesEnd()
{
return types.end();
}
И, вы можете перебирать от начала до конца, в C ++ 03:
// alias, because the full declaration is too long
typedef std::vector<std::string> VecStr ;
void foo(Union & p_union)
{
VecStr::iterator it = p_union.typesBegin() ;
VecStr::iterator itEnd = p_union.typesEnd() ;
for(; it != itEnd; ++it)
{
// here, "*it" is the current string item
std::cout << "The current value is " << *it << ".\n" ;
}
}
C ++ 11 версия
Если вы предоставите полный контейнер вместо только его итераторов, в C ++ 11 это станет проще, поскольку вы можете использовать цикл range-for (как foreach в Java и C #):
void foo(std::vector<std::string> & p_types)
{
for(std::string & item : p_types)
{
// here, "item " is the current string item
std::cout << "The current value is " << item << ".\n" ;
}
}
P.S .: Johannes Schaub - litb прав в использовании квалификатора "const" всякий раз, когда это возможно. Я сделал это не потому, что хотел избежать разбавления кода, но, в конце концов, «const» - ваш друг.