【问题标题】:Function with set<string> and iterator带有 set<string> 和迭代器的函数
【发布时间】:2013-12-03 02:00:51
【问题描述】:

这是我的作业:

编写一个函数来打印所有长度为 3 的字符串。你的 解决方案必须使用带有迭代器的 for 循环。
void print3(const set & str)

这是我的代码:

void print3(const set<string>& str){
    string st;
    set<string,less<string>>::iterator iter;

    for(iter=str.begin();iter!=str.end();++iter)
        {st=*iter;
    if(st.length()==3) cout<<st<<' ';
    }
}

但我认为这不好。有人有更好的代码吗?请帮我改进它。

-我还有一个关于迭代器的问题

 string name[]={"halohg","nui","ght","jiunji"};
        set<string> nameSet(name,name+4);
        set<string>::iterator iter;
iter=name.begin();

如何使用迭代器访问 name[2]="ght"? 我试过iter+2,但它有一些问题。我想我必须使用随机访问迭代器,但我不知道如何使用它。 请帮我。非常感谢!

【问题讨论】:

  • 这和 JavaScript 有什么关系?

标签: c++ stl iterator set


【解决方案1】:

关于改进的一些想法:

  1. 你可以去掉string st;,只检查if (iter-&gt;length() == 3)
  2. 另一个改进是使用const_iterator 而不是iterator,因为您没有修改任何项目。
  3. 另外,添加less&lt;string&gt;作为模板参数有点用处,因为那是default compare functor anyway,所以可以删除。
  4. 最后,以最小范围声明本地变量通常是个好主意(这样它们就不会污染其他范围或引入意外的隐藏问题),因此通常您希望在 for 中声明您的 iter

这样就变成了:

for (set<string>::const_iterator iter = str.begin(); iter != str.end(); ++iter) {
    if (iter->length() == 3) cout << *iter << ' ';
}

考虑到您的要求,这几乎是您所能得到的。

关于你的第二个问题,set 的迭代器不是随机访问迭代器。这是一个(常数)Bidirectional Iterator。不过,如果你愿意,你可以使用std::advance,然后这样做:

std::set<std::string>::iterator iter;
iter = name.begin();
std::advance(iter, 2);
// iter is now pointing to the second element

请记住 set 对其元素进行排序。

【讨论】:

  • iter-&gt;length() == 3?cout &lt;&lt; *iter &lt;&lt; ' ':continue;
  • @Vijay:认真的吗?您确实意识到这是不合法的,如果是,那是个坏主意,对吧?
猜你喜欢
  • 2022-07-18
  • 2012-01-20
  • 2015-12-05
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
相关资源
最近更新 更多