在Python中替换从不同迭代器获取值的最有效方法是什么,例如,alternate(xrange(1, 7, 2), xrange(2, 8, 2))它将产生1,2,3,4,5,6.我知道实现它的一种方法是:
def alternate(*iters):
while True:
for i in iters:
try:
yield i.next()
except StopIteration:
pass
Run Code Online (Sandbox Code Playgroud)
但是有更高效或更清洁的方式吗?(或者,更好的是,itertools我错过了一个功能?)
我正在尝试使用存储在std :: list中的数据元素来构建一个字符串,我希望逗号只放在元素之间(即,如果元素是列表中的{A,B,C,D},结果字符串应该是"A B C D".
此代码不起作用:
typedef std::list< shared_ptr<EventDataItem> > DataItemList;
// ...
std::string Compose(DataItemList& dilList)
{
std::stringstream ssDataSegment;
for(iterItems = dilList.begin();
iterItems != dilList.end();
iterItems++)
{
// Lookahead in list to see if next element is end
if((iterItems + 1) == dilList.end())
{
ssDataSegment << (*iterItems)->ToString();
}
else
{
ssDataSegment << (*iterItems)->ToString() << ",";
}
}
return ssDataSegment.str();
}
Run Code Online (Sandbox Code Playgroud)
如何使用迭代器获取std :: list中的"the-next-item"?我希望它是一个链表,为什么我不能进入下一个项目?
我有一个用c ++实现的红黑树.它支持STL映射的功能.树节点包含键和映射的值.我想为此编写一个迭代器类,但我仍然坚持如何做到这一点.我应该将它作为Tree类的内部类吗?任何人都可以给我一些指导如何写它+一些资源?
谢谢!!
我正在为迭代器编写一个瘦模板包装器,并在通过结构解除引用操作符时遇到绊脚石,主要是因为指针没有:
#include <vector>
struct mystruct {
int member;
};
template<class iterator>
struct wrap {
typedef typename std::iterator_traits<iterator>::pointer pointer;
iterator internal;
pointer operator->() {return internal.operator->();} //MARK1
};
int main() {
wrap<std::vector<mystruct>::iterator> a;
a->member;
wrap<mystruct*> b;
b->member;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
prog.cpp: In member function ‘typename std::iterator_traits<_Iter>::pointer wrap<iterator>::operator->() [with iterator = mystruct*]’:
prog.cpp:18: instantiated from here
prog.cpp:11: error: request for member ‘operator->’ in ‘((wrap<mystruct*>*)this)->wrap<mystruct*>::internal’, which is of non-class type ‘mystruct*’
Run Code Online (Sandbox Code Playgroud)
以下方法有效,但我不认为它可以工作.也就是说,如果迭代器的奇怪pointer类型与指向a的指针不同value_type.
pointer operator->() {return &*internal;} //MARK3
Run Code Online (Sandbox Code Playgroud) 我有一个链接列表,想知道连接的路径/周期.
我的链接看起来像这样:
[[0, 3], [1, 0], [3, 1]]
Run Code Online (Sandbox Code Playgroud)
我希望答案是这样的循环(或任何其他匹配循环):
[0,3,1]
Run Code Online (Sandbox Code Playgroud)
因此,您获取第一个子列表的第一个元素,然后您获取第二个元素,并查找以此元素开头的下一个子列表,然后重新开始.
有一种优雅的方式来实现这一目标吗?我尝试了reduce函数,但是链接必须以链接匹配的方式进行排序.
员工类:
public class Employee {
int empid;
String name;
int age;
public Employee(int empid,String name,int age)
{
this.empid=empid;
this.name=name;
this.age=age;
}
public int getEmpid() {
return empid;
}
public void setEmpid(int empid) {
this.empid = empid;
}
public String getname() {
return name;
}
public void setname(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Run Code Online (Sandbox Code Playgroud)
比较类:
public class Employee_comparator implements Comparator<Employee> {
@Override
public int …Run Code Online (Sandbox Code Playgroud) 正下方,的代码Iterator的++方法:
/** Concatenates this iterator with another.
*
* @param that the other iterator
* @return a new iterator that first yields the values produced by this
* iterator followed by the values produced by iterator `that`.
* @note Reuse: $consumesTwoAndProducesOneIterator
* @usecase def ++(that: => Iterator[A]): Iterator[A]
*/
def ++[B >: A](that: => GenTraversableOnce[B]): Iterator[B] = new Iterator[B] {
// optimize a little bit to prevent n log n behavior.
private var cur : Iterator[B] …Run Code Online (Sandbox Code Playgroud) 我一直在使用高度简洁和直观的C++语法来查找两个已排序的vectors并将结果放在第三个中vector:
vector<bar> a,b,c;
//...
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
std::back_inserter(c));
Run Code Online (Sandbox Code Playgroud)
这应该设置c为交集(a,b),假设a和b排序.
但是,如果我只是使用c.begin()(我以为我在某个地方看到了一个例子,这就是我做的原因):
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
c.begin());
Run Code Online (Sandbox Code Playgroud)
set_intersection期望OutputIteratorat参数.我认为标准只需要c.begin()返回a forward iterator,我想这可能是也可能不是OutputIterator.
无论如何,代码与c.begin()编译下铿锵.
保证在标准下发生什么?如果这编译,可能发生的事情 - 也就是说,当返回的迭代器c.begin()最终递增超过向量的末尾,并且尝试访问指向的元素时,必须/可能发生什么?在这种情况下,符合标准的实现是否可以无声地扩展向量,因此begin()实际上是一个OutputIterator类似的附加back_inserter?
我问这个主要是为了理解标准如何与迭代器一起工作:真正发生了什么,所以我可以使用STL超越复制和粘贴.
我正在尝试遍历列表,我需要在迭代到达列表末尾时执行特定操作,请参阅下面的示例:
data = [1, 2, 3]
data_iter = data.__iter__()
try:
while True:
item = data_iter.next()
try:
do_stuff(item)
break # we just need to do stuff with the first successful item
except:
handle_errors(item) # in case of no success, handle and skip to next item
except StopIteration:
raise Exception("All items weren't successful")
Run Code Online (Sandbox Code Playgroud)
我相信这段代码不是Pythonic,所以我正在寻找更好的方法.我认为理想的代码应该看起来像下面的假设:
data = [1, 2, 3]
for item in data:
try:
do_stuff(item)
break # we just need to do stuff with the first successful item
except:
handle_errors(item) # in …Run Code Online (Sandbox Code Playgroud) 我们可以在C++中使用remove_if来基于对元素进行操作的谓词在线性时间中从向量中移除元素.
bool condition(double d) {...}
vector<double> data = ...
std::remove_if (data.begin(), data.end(), condition);
Run Code Online (Sandbox Code Playgroud)
如果我的条件不依赖于价值,而是依赖指数怎么办?换句话说,如果我想删除所有奇数索引元素,或某些任意索引集等?
bool condition(int index) {//returns whether this index should be removed}
vector<double> data = ...
std::remove_if (data.begin(), data.end(), ???);
Run Code Online (Sandbox Code Playgroud)