set <string>和iterator </string>的函数

时间:2013-12-03 02:00:52

标签: c++ stl iterator set

这是我的作业:

编写一个函数来打印长度为3的所有字符串 解决方案必须使用带迭代器的for循环     void print3(const set&amp; 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 个答案:

答案 0 :(得分:0)

关于改进的一些想法:

  1. 您可以摆脱string st;,只需查看if (iter->length() == 3)
  2. 另一项改进是使用const_iterator代替iterator,因为您没有修改任何项目。
  3. 另外,添加less<string>作为模板参数是没用的,因为那是default compare functor anyway,因此可以将其删除。
  4. 最后,通常最好用最小范围声明你的本地人(这样他们不会污染其他范围或引入意外的隐藏问题),所以通常你想在{{iter中声明你的for 1}}。
  5. 所以它变成了:

    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对其元素进行排序。