函数在C ++中返回迭代器

时间:2012-01-11 16:10:29

标签: c++ iterator

以下是返回迭代器

的Java方法
vector<string> types;

// some code here

Iterator Union::types() 
{
    return types.iterator();
}

我想将此代码翻译为C ++。如何从此方法返回vector的迭代器?

6 个答案:

答案 0 :(得分:15)

这会将迭代器返回到types的开头:

std::vector<string>::iterator Union::types() 
{
    return types.begin();
}

但是,调用者也需要知道向量end()的{​​{1}}。 Java的types有一个方法Iterator:这在C ++中不存在。

您可以更改hasNext()以返回范围:

Union::types()

答案 1 :(得分:9)

您希望拥有beginend方法:

std::vector<string>::iterator Union::begin()
{
  return types.begin();
}

std::vector<string>::iterator Union::end()
{
  return types.end();
}

为了完整起见,您可能还希望拥有const个版本

std::vector<string>::const_iterator Union::begin()const
{
  return types.begin();
}

std::vector<string>::const_iterator Union::end()const
{
  return types.end();
}

答案 2 :(得分:3)

union是其成员的容器。我将使用beginend分别将迭代器返回给第一个和最后一个成员。

类型列表不是IMO工会的主要可迭代属性。所以我自己会使用以下内容,并为成员数据本身保留普通beginend

std::vector<string>::const_iterator Union::types_begin() const {
  return types.begin();
}

std::vector<string>::const_iterator Union::types_end() const {
  return types.end();
}

答案 3 :(得分:3)

返回迭代器很容易。例如,您可以在向量类型中返回第一个迭代器:

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循环(作为Java和C#中的foreach):

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”是你的朋友。

答案 4 :(得分:2)

假设类型是类Union的一个属性,一个很好的符合STL的方法是:

class Union
{
std::vector< std::string > types
public:
typedef std::vector< std::string >::iterator iterator;
iterator begin() { return types.begin(); }
iterator end() { return types.end(); }

};

答案 5 :(得分:0)

您可以按照以下方式执行此操作

std::vector<std::string> types

std::vector<std::string>::iterator Union::types(){
    return types.begin();
}