for (var k in dictionary)
{
var key:KeyType = KeyType(k);
var value:ValType = ValType(dictionary[k]); // <-- lookup
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这是我用来遍历字典中的条目.正如您在每次迭代中看到的那样,我在字典中执行查找.是否有更有效的方法来迭代字典(同时保持对密钥的访问)?
假设我有一个std::list<int> lst和一些std::list<int>::iterator it迭代列表.并依赖于it我想要使用的值it + 1或it - 1在我的代码中.有没有一些好方法可以做到这一点next(),prev()(我在stl文档中找不到这样的东西)?或者我应该复制it每次并增加(减少)副本?
请考虑以下情形.
List<String> list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
现在我添加了String此列表的值.
我使用以下方法来查看列表中的每个元素.
选项一 - 使用 for-each
for (String i : list) {
System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)
选项二 - 使用 Iterator
Iterator it=list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
Run Code Online (Sandbox Code Playgroud)
我只是想知道如果我使用for-each而不是有任何性能优势Iterator.现在在Java中使用Iterator也是一种不好的做法?
我有以下情况需要从流中删除元素.
map.entrySet().stream().filter(t -> t.getValue().equals("0")).
forEach(t -> map.remove(t.getKey()));
Run Code Online (Sandbox Code Playgroud)
在Java 8之前的代码中,可以从迭代器中删除 - 在这里处理这种情况的最佳方法是什么?
我有一个std::vector与n元素.现在我需要将指针传递n-1给具有函数最后元素的向量.
例如,我的vector<int> foo包含(5,2,6,87,251).一个函数需要vector<int>*,我想传递一个指针(2,6,87,251).
我可以(安全地)获取迭代器++foo.begin(),将其转换为指针并将其传递给函数吗?还是用&foo[1]?
更新:人们建议我改变我的函数来获取迭代器而不是指针.在我的情况下,这似乎是不可能的,因为我提到的find功能是...的功能unordered_set<std::vector*>.那么在这种情况下,是将n-1元素复制foo到一个新的向量中并find使用指向该唯一选项的指针进行调用?非常低效!这就像画家Shlemiel,特别是因为我必须查询许多子集:最后一个n-1,然后n-2等等元素,看看它们是否在unordered_set.
是否可以在Java中合并迭代器?我有两个迭代器,我想组合/合并它们,以便我可以一次性迭代它们的元素(在同一个循环中)而不是两个步骤.那可能吗?
请注意,两个列表中的元素数量可能不同,因此两个列表上的一个循环不是解决方案.
Iterator<User> pUsers = userService.getPrimaryUsersInGroup(group.getId());
Iterator<User> sUsers = userService.getSecondaryUsersInGroup(group.getId());
while(pUsers.hasNext()) {
User user = pUsers.next();
.....
}
while(sUsers.hasNext()) {
User user = sUsers.next();
.....
}
Run Code Online (Sandbox Code Playgroud) 我有一个集合,我想获得该集合的最后一个元素.什么是最直接,最快捷的方式?
一种解决方案是首先使用toArray(),然后返回数组的最后一个元素.还有其他更好的吗?
作为扩展到这个问题是const_iterators更快?,我有另一个问题const_iterators.如何删除一个常量const_iterator?虽然迭代器是指针的通用形式,但仍然const_iterator和iterators是两个不同的东西.因此,我相信,我也不能用来const_cast<>转换const_iterator为iterators.
一种方法可能是您定义一个迭代器,该迭代器将元素移动到该const_iterator点的元素.但这看起来像是一个线性时间算法.
对于实现这一目标的最佳方法有什么想法吗?
如何使用Python C API复制以下Python代码?
class Sequence():
def __init__(self, max):
self.max = max
def data(self):
i = 0
while i < self.max:
yield i
i += 1
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有这个:
#include <Python/Python.h>
#include <Python/structmember.h>
/* Define a new object class, Sequence. */
typedef struct {
PyObject_HEAD
size_t max;
} SequenceObject;
/* Instance variables */
static PyMemberDef Sequence_members[] = {
{"max", T_UINT, offsetof(SequenceObject, max), 0, NULL},
{NULL} /* Sentinel */
};
static int Sequence_Init(SequenceObject *self, PyObject *args, PyObject *kwds)
{
if (!PyArg_ParseTuple(args, "k", &(self->max))) { …Run Code Online (Sandbox Code Playgroud) 有人会如何实现以下结构的特征Iterator和IntoIterator特征?
struct Pixel {
r: i8,
g: i8,
b: i8,
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下各种形式但没有成功.
impl IntoIterator for Pixel {
type Item = i8;
type IntoIter = Iterator<Item=Self::Item>;
fn into_iter(self) -> Self::IntoIter {
[&self.r, &self.b, &self.g].into_iter()
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码给了我一个编译错误
error[E0277]: the trait bound `std::iter::Iterator<Item=i8> + 'static: std::marker::Sized` is not satisfied
--> src/main.rs:7:6
|
7 | impl IntoIterator for Pixel {
| ^^^^^^^^^^^^ the trait `std::marker::Sized` is not implemented for `std::iter::Iterator<Item=i8> + 'static`
|
= note: `std::iter::Iterator<Item=i8> + 'static` does …Run Code Online (Sandbox Code Playgroud) iterator ×10
java ×4
c++ ×3
iteration ×2
stl ×2
c ×1
collections ×1
dictionary ×1
foreach ×1
generator ×1
java-stream ×1
list ×1
pointers ×1
python ×1
python-c-api ×1
rust ×1
vector ×1