标签: iterator

反向实际反转Python迭代器吗?

所以我可以在列表上创建一个反向迭代器:

list(reversed([0,1,2,3]))

[3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

我以为这只是简单地调用getitem从指数len(...)-10.但是我不能这样做:

list(reversed(xrange(4)))

[3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

现在我有点困惑.这会创建列表xrange(4)然后反转它吗?如果没有,它如何知道最后一个元素是什么以及如何倒退?我阅读了文档,但没有用.

python reverse iterator python-2.7

6
推荐指数
1
解决办法
743
查看次数

按顺序迭代多个排序列表

假设我有许多对(int,str)列表,不一定长度相同.这里唯一的限制是列表按整数部分按升序排序:

a = [(1, 'a'), (4, 'a'), (6, 'b'), (7, 'c'), (12, 'a')]
b = [(5, 'd'), (10, 'c'), (11,'e')]
c = [(0, 'b'), (3, 'd')]
Run Code Online (Sandbox Code Playgroud)

我想要做的是按照相应的整数元素出现的顺序发出字符串元素,即在这种情况下:

(0, 'b'), (1, 'a'), (3, 'd'), (4, 'a'), ... 
Run Code Online (Sandbox Code Playgroud)

我想知道是否有明显的(漂亮+ Python化)的方式来做到这一点只用迭代器a,bc?我已经看过,itertools但在这种情况下无法立即看到如何使用该功能.这些名单a,b,c可能是非常大的,所以我想这样做不读他们入内存,然后排序...

python iterator list

6
推荐指数
1
解决办法
834
查看次数

GCC 4.9和clang 3.5中的std :: rbegin和std :: rend函数

我一直在MSVC 2013中使用std :: rbegin和std :: rend.当我尝试使用GCC 4.9.1或clang 3.5.0编译我的代码时,两者都告诉我'rbegin'和'rend'不属于命名空间'std'.

请参阅下面的代码示例.我做错了什么还是他们还没有在GCC和clang中实现?

// test.cpp

#include <vector>
#include <iostream>
#include <iterator>

int main(int, char**)
{
    std::vector<int> test = {1, 2, 3 ,4, 5};
    for (auto it = std::rbegin(test); it != std::rend(test); ++it) {
        std::cout << *it << ", ";
    }
    std::cout << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

GCC输出:

g++ --std=c++14 test.cpp -o test && ./test
test.cpp: In function ‘int main(int, char**)’:
test.cpp:10:20: error: ‘rbegin’ is not a member of ‘std’
     for (auto it = std::rbegin(test); …
Run Code Online (Sandbox Code Playgroud)

c++ gcc iterator clang c++14

6
推荐指数
1
解决办法
1305
查看次数

为什么类HashSet <T>在使用迭代器时已经对值进行了排序?

我在我的main方法上有以下代码,当我遍历Set并打印值时,值已经被排序.什么原因?

Set<Integer> set = new HashSet<Integer>();
set.add(2);
set.add(7);
set.add(3);
set.add(9);
set.add(6);

for(int i : set) {
    System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

输出:

2
3
6
7
9
Run Code Online (Sandbox Code Playgroud)

java iterator hashset

6
推荐指数
1
解决办法
120
查看次数

有没有相当于Python for for循环的JavaScript?

所以我很失望地发现JavaScript for ( var in array/object)并不等同于蟒蛇for var in list:.

在JavaScript中,您正在迭代索引本身,例如

0, 
1,
2,
... 
Run Code Online (Sandbox Code Playgroud)

与Python一样,您正在迭代索引指向的值,例如

"string var at index 0", 
46, 
"string var at index 2",
["array","of","values"],
...
Run Code Online (Sandbox Code Playgroud)

是否存在与Python的循环机制等效的标准JavaScript?

免责声明:

我知道for(var in object)构造意味着用于迭代字典中的键,而不是通常在数组的索引上.我问一个特定的问题,这个问题与我不关心顺序(或非常关于速度)的用例有关,并且只是不想使用while循环.

javascript python iterator loops for-loop

6
推荐指数
2
解决办法
3500
查看次数

具有移动迭代器的独特算法

是否允许使用std::unique通过函数创建的迭代器std::make_move_iterator?我尝试了以下,并取得了成功:

#include <iostream>
#include <ostream>
#include <vector>
#include <algorithm>
#include <limits>
#include <iterator>

#include <cstdlib>

struct A
{

    A() : i(std::numeric_limits< double >::quiet_NaN()) { std::cout << __PRETTY_FUNCTION__ << "\n"; }
    A(double ii) : i(ii) { std::cout << __PRETTY_FUNCTION__ << "\n"; }
    A(A const & a) : i(a.i) { std::cout << __PRETTY_FUNCTION__ << "\n"; }
    A(A && a) : i(std::move(a.i)) { std::cout << __PRETTY_FUNCTION__ << "\n"; a.i = std::numeric_limits< double >::quiet_NaN(); }
    A & operator …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm iterator stl c++14

6
推荐指数
1
解决办法
185
查看次数

为什么str(反向(...))不能给我反转的字符串?

我正在尝试习惯迭代器.为什么我输入

b = list(reversed([1,2,3,4,5]))
Run Code Online (Sandbox Code Playgroud)

它会给我一个反向列表,但是

c = str(reversed('abcde'))
Run Code Online (Sandbox Code Playgroud)

不会给我一个反转的字符串?

python string iterator list

6
推荐指数
1
解决办法
3791
查看次数

java中的迭代器类型(弱一致)

我理解fail-fast(LinkedList)和故障安全(copyonwrite)迭代器,但是弱的一致性仍然是个谜.

文档说它可能反映了底层集合的变化,但不能保证.因此,我认为弱一致性不会创建支持集合的副本.(在并发Map中,它在同一个bucketarray上工作).

我假设如果一个线程A创建了一个迭代器并且经过了一半,那么当线程B将一个项目放到数组开头的桶中时,这个更改对于线程A的迭代器是不可见的.

如果B将该项放到数组的末尾,A就会看到它.

是否可能有一个nosuchelement例外?

如果线程A创建一个迭代器,然后遍历到一个项目X,它有一个下一个项目Y,然后jvm停止线程A并恢复线程B,谁删除Y.这对线程A是否可见(我想是这样,否则并发映射将不会'是线程安全的,但对其迭代器的实现方式一无所知),因为它对线程A不可见,那么它很容易引发异常.

java multithreading iterator thread-safety

6
推荐指数
1
解决办法
1364
查看次数

用Java设计迭代器

我遇到了许多需要迭代器的问题.通常,它们是简单的事情,您已经拥有了可以遵循的基础数据结构.其他时候,它变得更加复杂.

一个例子是使用有序遍历在没有父链接的情况下迭代BST.这要求您执行以下操作:

  • 在构造函数中创建一个堆栈.
  • 迭代到最左边的节点.
  • 存储有更多节点可供访问,以便从hasNext()轻松返回.
  • 存储下一个要访问的节点,以便从next()轻松返回.

您可以完成工作以在hasNext()或next()中找到下一个节点.您还可以在构造函数中或第一次调用hasNext()时找到第一个节点.


我的问题

在迭代器实现中,有哪些标准或最佳实践可用于执行大部分工作?一种方式比另一种"更清洁"吗?

java iterator iterable

6
推荐指数
1
解决办法
270
查看次数

Traits类从back_insert_iterator中提取容器的value_type

std::back_insert_iterator具有value_type等于void,但它也有一个protected构件container,其保持指针到底层Container.我试图写一个traits类来提取容器value_type,沿着这些方向:

#include <iterator>
#include <type_traits>
#include <vector>

template<class OutputIt>
struct outit_vt
:
    OutputIt
{
    using self_type = outit_vt<OutputIt>;
    using value_type = typename std::remove_pointer_t<decltype(std::declval<self_type>().container)>::value_type;
};

int main()
{
    std::vector<int> v;
    auto it = std::back_inserter(v);
    static_assert(std::is_same<outit_vt<decltype(it)>::value_type, int>::value, "");
}
Run Code Online (Sandbox Code Playgroud)

实例

但是,这(或多或少地预期)会遇到不完整的类型错误.反正这是为了得到容器的提取物value_type吗?

c++ iterator value-type type-traits inserter

6
推荐指数
1
解决办法
866
查看次数