这是一个看似简单的问题:给定一个按升序生成整数序列的迭代器列表,编写一个简洁的生成器,只生成每个序列中出现的整数.
在昨晚阅读了几篇论文之后,我决定在Python中破解一个完全最小的全文索引器,如此处所示(尽管该版本现在已经很老了).
我的问题在于search()函数,它必须迭代每个发布列表并仅产生每个列表上显示的文档ID.正如您从上面的链接中看到的那样,我当前的非递归"工作"尝试非常糟糕.
示例:
postings = [[1, 100, 142, 322, 12312],
[2, 100, 101, 322, 1221],
[100, 142, 322, 956, 1222]]
Run Code Online (Sandbox Code Playgroud)
应该产量:
[100, 322]
Run Code Online (Sandbox Code Playgroud)
至少有一个优雅的递归函数解决方案,但我想尽可能避免这种情况.但是,一个涉及嵌套生成器表达式,itertools滥用或任何其他类型的代码高尔夫的解决方案非常受欢迎.:-)
应该可以安排函数只需要与最小列表中的项目一样多的步骤,并且不将整个整数集吸入内存.将来,这些列表可能从磁盘读取,并且大于可用RAM.
在过去的30分钟里,我对我的舌尖有了一个想法,但我无法将其纳入代码中.请记住,这只是为了好玩!
通常我们写这个来从地图中获取键和值.
Map m=new HashMap();
Set s=map.entrySet();
Iterator i=s.iterator()
while(s.hasNext()){
Map.Entry m= (map.Entry) s.next();
System.out.println(""+m.getKey()+""+ m.getValue());
}
Run Code Online (Sandbox Code Playgroud)
为什么我们使用set迭代为什么不直接映射?
我想从向量返回一个对象的引用,该对象在一个迭代器对象中.我怎样才能做到这一点?
我尝试了以下方法:
Customer& CustomerDB::getCustomerById (const string& id) {
vector<Customer>::iterator i;
for (i = customerList.begin(); i != customerList.end() && !(i->getId() == id); ++i);
if (i != customerList.end())
return *i; // is this correct?
else
return 0; // getting error here, cant return 0 as reference they say
}
Run Code Online (Sandbox Code Playgroud)
在代码中,customerList是客户的向量,函数getId返回客户的id.
是对的*i吗?我怎么能返回0或null作为参考?
给定具有以下接口的基类:
public class Base
{
public virtual IEnumerable<string> GetListOfStuff()
{
yield return "First";
yield return "Second";
yield return "Third";
}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个覆盖该方法的派生类,并添加自己的东西,如下所示:
public class Derived : Base
{
public override IEnumerable<string> GetListOfStuff()
{
foreach (string s in base.GetListOfStuff())
{
yield return s;
}
yield return "Fourth";
yield return "Fifth";
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我受到了警告,"无法验证通过迭代器中的基本关键字访问成员".
那么这个问题的解决方案是什么?
有时我厌倦了所有这些my_vector.begin(), my_vector.end()噪音.去年在boostcon上,Andrei Alexandrescu的主题演讲名为Iterators Must Go(视频)
将范围引入C++是否有任何进展,我终于可以说了std::sort(my_vector)吗?
我有一个问题,我想使用ImageMagick的convert.exe合并大量的图像,但在Windows下我有一个8192字节长的命令行限制.
我的解决方案是将任务拆分为更小的子任务,运行它们,并执行将它们组合在一起的最终任务.
我的想法是编写一个函数,它接受一个图像矢量和一个整数,并将矢量分成n个子矢量,所有子矢量都具有"几乎相等"的部分.
因此,例如,如果我想将11分成3组,那么它将是4-4-3.
你能告诉我怎么用C++做的吗?我的意思是,写一个函数
split_vec( const vector<image> &images, int split )
Run Code Online (Sandbox Code Playgroud)
哪个分裂?
另外,如果我不需要创建新的向量,只是遍历子部分,你能告诉我最有效的方法吗?喜欢的std::substr功能有std::string?
注意:我已经在项目中使用了Boost,所以如果在Boost中有一些不错的工具,那么它对我来说是完美的.
这不是如何克隆迭代器的重复?
请不要盲目关闭这个问题,所谓的重复给出所有的答案不要工作.OP负责另一个问题,显然,答案符合HIS问题,但不是我的问题.
不是每个类似的问题都是重复的,在SE上有"扩展问题"这样的特征,唯一的方法是再次询问同一主题,以获得不同的,有效的答案.
我有迭代器.我想得到它的复制(复制),然后我可以完全独立地继续原始和复制.
重要
通过反射或序列化进行复制是不行的(性能损失).
例
var list = List(1,2,3,4,5)
var it1 = list.iterator
it1.next()
var it2 = it1 // (*)
it2.next()
println(it1.next())
Run Code Online (Sandbox Code Playgroud)
这将简单地引用it1,因此当改变it1时,it2也会改变,反之亦然.
上面的例子使用List,我目前正在与HashMap斗争,但问题是一般的 - 只是迭代器.
如果你编辑行(*)并写:
var it2 = it1.toList.iterator
Run Code Online (Sandbox Code Playgroud)
(这被建议作为链接问题中的解决方案)执行程序时抛出异常.
"你拿这份清单......".不,我没有.我没有列表,我有迭代器.一般来说,我不知道任何关于迭代器的基础的集合,我唯一拥有的是迭代器.我必须"分叉"它.
Python中的其他空对象评估为False - 我如何才能获得迭代器/生成器呢?
这IteratorAggregate是一个创建外部迭代器的接口:
class myData implements IteratorAggregate
{
public $property1 = "Public property one";
public $property2 = "Public property two";
public $property3 = "Public property three";
public function __construct()
{
$this->property4 = "last property";
}
public function getIterator()
{
return new ArrayIterator($this);
}
}
$obj = new myData;
Run Code Online (Sandbox Code Playgroud)
并且您将能够使用foreach以下方式遍历对象:
foreach($obj as $key => $value) {
var_dump($key, $value);
echo "\n";
}
Run Code Online (Sandbox Code Playgroud)
虽然Iterator是外部迭代器或对象的接口,可以在内部迭代:
class myIterator implements Iterator
{
private $position …Run Code Online (Sandbox Code Playgroud) 考虑一个输入迭代器join_iterator:它迭代其他范围的串联.调用++i反复可以多比简单的慢i += n.
尽管如此,大多数C++代码都要求使用任意数量的迭代器,当迭代器不是随机访问时std::advance,它会自动转向调用++i.
(可悲的是,大多数人使用std::advance(i, n)而不是using std::advance; advance(i, n),所以我不能只advance为我的迭代器供应并依赖ADL.)
另一方面,我不能使用+或+=因为输入迭代器不必实现它们.
所以问题是:在以下情况下,我将如何支持这种情况:
实现这样的迭代器?
使用可能具有优化的输入迭代器operator +=?
(注意advance并且+这不是唯一重要的情况 - distance并且-具有相同的问题.)