具有集合<string>和迭代器的函数
Function with set<string> and iterator
这是我的作业:
编写一个函数来打印所有长度为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
,但它有一些问题。我想我必须使用随机访问迭代器,但我不知道如何使用它。请帮帮我。非常感谢!
关于改进的一些想法:
- 你可以去掉
string st;
,只检查if (iter->length() == 3)
- 另一个改进是使用
const_iterator
而不是iterator
,因为您不修改任何项目 - 此外,添加
less<string>
作为模板参数是没有用的,因为这是默认的比较函子,所以可以删除它 - 最后,通常最好用最小的作用域声明您的本地域(这样它们就不会污染其他作用域或引入意外的隐藏问题),所以通常您希望在
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
对其元素进行排序。
相关文章:
- 如何在C++中将迭代器作为函数参数传递
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- 如何创建迭代器函数
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- 使用迭代器的模板类的构造函数
- C++:复制迭代器的构造函数
- 基于函数而不是集合的二分搜索或迭代器?
- 成员函数中的迭代器出现问题
- 使用迭代器的自定义比较器函数
- 专门C++使用指针值类型的通用迭代器的模板函数?
- 从 std::vector 迭代器中执行函数指针
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 如何基于循环迭代器选择函数
- 矢量迭代器在尝试调用函数时使我的程序崩溃
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 具有C++迭代器参数的多功能函数
- C++如何获取传递给函数(STL 迭代器)的参数的名称
- C++ 对自定义映射迭代器函数的未定义引用