以下是返回迭代器
的Java方法vector<string> types;
// some code here
Iterator Union::types()
{
return types.iterator();
}
我想将此代码翻译为C ++。如何从此方法返回vector的迭代器?
答案 0 :(得分:15)
这会将迭代器返回到types
的开头:
std::vector<string>::iterator Union::types()
{
return types.begin();
}
但是,调用者也需要知道向量end()
的{{1}}。
Java的types
有一个方法Iterator
:这在C ++中不存在。
您可以更改hasNext()
以返回范围:
Union::types()
答案 1 :(得分:9)
您希望拥有begin
和end
方法:
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是其成员的容器。我将使用begin
和end
分别将迭代器返回给第一个和最后一个成员。
类型列表不是IMO工会的主要可迭代属性。所以我自己会使用以下内容,并为成员数据本身保留普通begin
和end
。
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();
}
但是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中,它变得更容易,因为你可以使用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();
}