具有集合<string>和迭代器的函数

Function with set<string> and iterator

本文关键字:迭代器 函数 gt string lt 集合      更新时间:2023-10-16

这是我的作业:

编写一个函数来打印所有长度为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,但它有一些问题。我想我必须使用随机访问迭代器,但我不知道如何使用它。请帮帮我。非常感谢!

关于改进的一些想法:

  1. 你可以去掉string st;,只检查if (iter->length() == 3)
  2. 另一个改进是使用const_iterator而不是iterator,因为您不修改任何项目
  3. 此外,添加less<string>作为模板参数是没有用的,因为这是默认的比较函子,所以可以删除它
  4. 最后,通常最好用最小的作用域声明您的本地域(这样它们就不会污染其他作用域或引入意外的隐藏问题),所以通常您希望在for中声明您的iter

所以它变成了:

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

考虑到你的要求,这是你能得到的最好的。

至于第二个问题,set的迭代器不是一个随机访问迭代器。它是一个(常数)双向迭代程序。不过,如果你愿意,你可以使用std::advance,并执行:

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

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