所以我可以在列表上创建一个反向迭代器:
list(reversed([0,1,2,3]))
[3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)
我以为这只是简单地调用getitem从指数len(...)-1到0.但是我不能这样做:
list(reversed(xrange(4)))
[3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)
现在我有点困惑.这会创建列表xrange(4)然后反转它吗?如果没有,它如何知道最后一个元素是什么以及如何倒退?我阅读了文档,但没有用.
假设我有许多对(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,b和c?我已经看过,itertools但在这种情况下无法立即看到如何使用该功能.这些名单a,b,c可能是非常大的,所以我想这样做不读他们入内存,然后排序...
我一直在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) 我在我的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) 所以我很失望地发现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循环.
是否允许使用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) 我正在尝试习惯迭代器.为什么我输入
b = list(reversed([1,2,3,4,5]))
Run Code Online (Sandbox Code Playgroud)
它会给我一个反向列表,但是
c = str(reversed('abcde'))
Run Code Online (Sandbox Code Playgroud)
不会给我一个反转的字符串?
我理解fail-fast(LinkedList)和故障安全(copyonwrite)迭代器,但是弱的一致性仍然是个谜.
文档说它可能反映了底层集合的变化,但不能保证.因此,我认为弱一致性不会创建支持集合的副本.(在并发Map中,它在同一个bucketarray上工作).
我假设如果一个线程A创建了一个迭代器并且经过了一半,那么当线程B将一个项目放到数组开头的桶中时,这个更改对于线程A的迭代器是不可见的.
如果B将该项放到数组的末尾,A就会看到它.
是否可能有一个nosuchelement例外?
如果线程A创建一个迭代器,然后遍历到一个项目X,它有一个下一个项目Y,然后jvm停止线程A并恢复线程B,谁删除Y.这对线程A是否可见(我想是这样,否则并发映射将不会'是线程安全的,但对其迭代器的实现方式一无所知),因为它对线程A不可见,那么它很容易引发异常.
我遇到了许多需要迭代器的问题.通常,它们是简单的事情,您已经拥有了可以遵循的基础数据结构.其他时候,它变得更加复杂.
一个例子是使用有序遍历在没有父链接的情况下迭代BST.这要求您执行以下操作:
您可以完成工作以在hasNext()或next()中找到下一个节点.您还可以在构造函数中或第一次调用hasNext()时找到第一个节点.
我的问题
在迭代器实现中,有哪些标准或最佳实践可用于执行大部分工作?一种方式比另一种"更清洁"吗?
在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吗?