是的 - 标题几乎总结了它.我有很多实现迭代器概念的类型,我想知道是否值得引入这个boost头而不是手动实现.
至今:
好处
我正在尝试使用s:iterator迭代一个地图列表.我可以毫无问题地遍历List,但是我不能让它迭代遍历地图的条目.到目前为止,我有这个:
[..]
<s:iterator value="records" status="recordsStatus" var="record">
<s:if test="#recordsStatus.index ==0">
<tr>
<td colspan="*"></td>
</tr>
</s:if>
<tr>
<s:iterator value="record.entrySet()" status="fieldStatus">
<td>
<s:property value="key"/>/<s:property value="value"/>
</td>
</s:iterator>
</tr>
</s:iterator>
[..]
Run Code Online (Sandbox Code Playgroud)
标签生成
<tr></tr>
Run Code Online (Sandbox Code Playgroud)
对于每个条目,但它不会通过第二个迭代器,所以我想我在使用value属性做错了.你能帮帮我吗?
谢谢
何塞
//for( unsigned int i=0; i < c.size(); i++ ) tolower( c[i] );
for_each( c.begin(), c.end(), tolower );
Run Code Online (Sandbox Code Playgroud)
我试图使用for_each循环代替for循环进行赋值.
我不确定为什么我收到此错误消息:
In function âvoid clean_entry(const std::string&, std::string&)â:
prog4.cc:62:40: error: no matching function for call to âfor_each(std::basic_string<char>::iterator, std::basic_string<char>::iterator, <unresolved overloaded function type>)â
Run Code Online (Sandbox Code Playgroud) 我写了一个非常简单的文件管理数据库,基本上看起来像这样:
class FileDB
{
public:
FileDB(std::string dir) : rootDir(dir) { }
void loadFile(std::string filename, File &file) const;
void saveFile(std::string filename, const File &file) const;
private:
std::string rootDir;
}
Run Code Online (Sandbox Code Playgroud)
现在我想迭代遍历数据库中包含的所有文件,例如使用std::iterator:
void iterateFiles()
{
FileDB filedb("C:\\MyFiles");
for (FileDB::iterator file_it = filedb.begin(); file_it != filedb.end(); ++file_it)
{
File f = *file_it;
// do something with file
}
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了类似问题的答案,有些人建议推导std::iterator,有些人要使用std::iterator_traits,但我真的不明白该怎么做.尝试实现自定义迭代器时可能出现什么问题?什么是简单而优雅的方式呢?
编辑: 请不要考虑使用提升,我的问题更具概念性.
编辑2:
FileDB的工作方式如下:
ROOTDIR
foo2的
欢
barM中
所以基本上,我可以通过它的名字找到一个文件.
由于我的容器不在内存中,因此我没有指向其数据的指针.所以我的想法是将文件的路径存储在迭代器中.这样,我可以 …
在C#中,使用LINQ,如果我有en枚举enumerable,我可以这样做:
// a: Does the enumerable contain an item that satisfies the lambda?
bool contains = enumerable.Any(lambda);
// b: How many items satisfy the lambda?
int count = enumerable.Count(lambda);
// c: Return an enumerable that contains only distinct elements according to my custom comparer
var distinct = enumerable.Distinct(comparer);
// d: Return the first element that satisfies the lambda, or throws an exception if none
var element = enumerable.First(lambda);
// e: Returns an enumerable containing all the elements except …Run Code Online (Sandbox Code Playgroud) 我有一个带有一些对象组合的模型类,我不知道为此编写迭代器的最佳方法.要更详细地查看问题,这里是层次结构(半伪代码):
Root类:
MYEntity : NSObject
@property int commonProperty;
@property NSArray *childs; //Childs of any kind.
Run Code Online (Sandbox Code Playgroud)
一些具体的子类:
MYConcreteStuff : MYEntity
@property int number;
MYConcreteThing : MYEntity
@property NSString *string;
Run Code Online (Sandbox Code Playgroud)
并且具有具体集合的根对象:
MYRoot : MYEntity
@property MYEntity *stuff; //Collect only stuff childs here.
@property MYEntity *things; //Collect only thing childs here.
Run Code Online (Sandbox Code Playgroud)
现在我可以为集合编写很酷的成员访问器(在MYEntity中),如:
-(MYEntity*)entityForIndex:(int) index
{
if ([self.childs count] > index)
return [self.childs objectAtIndex:index];
return nil;
}
Run Code Online (Sandbox Code Playgroud)
对于根对象,甚至更酷,良好类型的成员成员访问器.
-(MYConcreteThing*)thingForIndex:(int) index
{
if ([self.things count] > index)
return (MYConcreteThing*)[self.things entityForIndex];
return nil;
}
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何为这样的集合编写一些oneliner迭代器.想要的客户端代码如下:
for …Run Code Online (Sandbox Code Playgroud) 要迭代输入流,我们通常会使用std::istream_iterator如下:
typedef std::istream_iterator<std::string> input_iterator;
std::ifstream file("myfile");
for (input_iterator i(file); i != input_iterator(); i++) {
// Here, *i denotes each element extracted from the file
}
Run Code Online (Sandbox Code Playgroud)
如果我们可以使用基于范围的for语句来迭代输入流,那就太好了.但是,对于类的对象,范围为基础的for需要的对象具有begin()和end()成员函数(§6.5.4,粗体强调):
如果
_RangeT是一个数组类型,开始-EXPR和最终EXPR是__range和__range + __bound分别,其中__bound在阵列的约束.如果_RangeT是未知大小的数组或不完整类型的数组,则该程序格式不正确;如果
_RangeT是一个类型时,不合格的IDSbegin并且end在类的范围查找_RangeT仿佛由类成员访问查找(3.4.5),并且如果任一个(或两者)找到至少一个声明,开始-EXPR和端-expr分别是__range.begin()和__range.end();否则,开始-EXPR和最终EXPR是
begin(__range)和end(__range) …
在Rust中有一种自然的方法来迭代几个范围或迭代器的"产品"吗?
当您在多维数组或某些状态空间上进行迭代时,会出现这种情况.例如,我想考虑具有5个元素的布尔元组的所有可能值.嵌套5个for循环有点笨拙.
我有一个Vec<Result<T, E>>,我想忽略所有的Err值,将其转换为Vec<T>.我可以做这个:
vec.into_iter().filter(|e| e.is_ok()).map(|e| e.unwrap()).collect()
Run Code Online (Sandbox Code Playgroud)
这是安全的,但我想避免使用unwrap.有没有更好的方法来写这个?
如何检查切片是否已排序?
假设一个接受切片的函数i32,是否有一种惯用的Rust检查切片是否已排序的方法?
fn is_sorted(data: &[i32]) -> bool {
// ...
}
Run Code Online (Sandbox Code Playgroud)
是否有可能推广上述方法以便接受迭代器?
fn is_sorted<I>(iter: I)
where
I: Iterator,
I::Item: Ord,
{
// ...
}
Run Code Online (Sandbox Code Playgroud)