我试图找到一种访问一组容器的通用方法.除了另一个自定义列表外,我还有一个标准的矢量和列表.
自定义列表定义了一个迭代器;
class Iterator: public std::iterator<std::forward_iterator_tag, T> {
// ...
}
Iterator begin() {
return (Iterator(root));
}
Iterator end() {
return (Iterator(NULL));
}
Run Code Online (Sandbox Code Playgroud)
与适当的运算符重载.
理想情况下,我想这样做;
class Foo {
public:
Foo() {
std::list<int> x;
std::vector<int> y;
custom_list<int> z;
iter = x.begin(); // OR
iter = y.begin(); // OR
iter = z.begin();
// ...
};
private:
std::iterator<int> iter;
};
Run Code Online (Sandbox Code Playgroud)
但显然这些都是不同类型的迭代器.我可以假设所有容器都是相同类型的.
有没有一种优雅的方法来解决这个问题?
我喜欢递归.我认为它简化了很多事情.另一个可能不同意; 我认为这也使代码更容易阅读.但是,我注意到递归在C#等语言中并没有像在LISP中那样被使用(顺便提一下,这是我最喜欢的语言).
有没有人知道是否有任何好的理由不使用C#等语言的递归?它比迭代更昂贵吗?
前几天我以为我在jQuery中看到了一个对象迭代器,它有一个可以设置为递归迭代子对象的标志.我认为它是jQuery.each()的一部分,但现在我没有在文档中看到这种功能.
在jQuery中是否有任何可以自动递归的迭代器?
(我知道如何在javascript中执行此操作.只是想知道我是否真的看到了我以为我看到的内容.)
非常感谢!
编辑:要清楚,我正在考虑像jQuery.each()这样的实用程序方法,它将在javascript对象及其嵌套对象上递归迭代.
给定下面的示例,each()方法将遍历所有对象,包括myobj.obj2.key2中的嵌套对象.
我本可以发誓我在jQuery文档中看到了一些关于它的东西,但现在我找不到了.
谢谢.
var myobj = {
obj1: {key1:'val1', key2:'val2'},
obj2: {key1:'val1', key2: {nest1:'val1', nest2:'val2', nest3:'val3'}},
obj3: {key1:'val1', key2:'val2'}
}
$jQuery.each(myobj, function(key,val) {
// Code to run over each key/val pair
// Does so recursively to include all nested objects
})
Run Code Online (Sandbox Code Playgroud) 一旦前一个输入达到最大长度值,如何关注下一个输入?
a: <input type="text" maxlength="5" />
b: <input type="text" maxlength="5" />
c: <input type="text" maxlength="5" />
Run Code Online (Sandbox Code Playgroud)
如果用户粘贴的文本大于maxlength,理想情况下它应该溢出到下一个输入中.
jsFiddle: http ://jsfiddle.net/4m5fg/1/
我必须强调,我不希望使用的插件,因为我宁愿学习背后的逻辑,不是使用已经存在的东西.感谢您的理解.
让我们考虑这个迭代列表的代码,同时每次迭代删除一个项目:
x = list(range(5))
for i in x:
print(i)
x.pop()
Run Code Online (Sandbox Code Playgroud)
它会打印出来0, 1, 2.由于前两次迭代删除了列表中的最后两个元素,因此仅打印前三个元素.
但是如果你在dict上尝试类似的东西:
y = {i: i for i in range(5)}
for i in y:
print(i)
y.pop(i)
Run Code Online (Sandbox Code Playgroud)
它将打印0,然后提升RuntimeError: dictionary changed size during iteration,因为我们正在迭代它时从字典中删除一个键.
当然,在迭代期间修改列表是不好的.但是为什么RuntimeError不像字典那样提出?这种行为有什么好的理由吗?
在Java中,以老式的方式迭代数组是否更快,
for (int i = 0; i < a.length; i++)
f(a[i]);
Run Code Online (Sandbox Code Playgroud)
或者使用更简洁的表格,
for (Foo foo : a)
f(foo);
Run Code Online (Sandbox Code Playgroud)
对于ArrayList,答案是否相同?
当然,对于大量的应用程序代码,答案是它没有明显的区别,因此应该使用更简洁的表单来提高可读性.然而,我正在研究的背景是重型技术计算,必须执行数十亿次操作,因此即使很小的速度差异也可能最终显着.
有时候,我只想为一个条目列表执行一个函数 - 例如:
for x in wowList:
installWow(x, 'installed by me')
Run Code Online (Sandbox Code Playgroud)
有时我需要这些东西用于模块初始化,所以我不希望在全局命名空间中有像x这样的足迹.一种解决方案是将map与lambda一起使用:
map(lambda x: installWow(x, 'installed by me'), wowList)
Run Code Online (Sandbox Code Playgroud)
但这当然会创建一个很好的列表[无,无,...]所以我的问题是,如果有一个没有返回列表的类似函数 - 因为我只是不需要它.
(当然我也可以使用_x,因此不会留下可见的足迹 - 但地图解决方案看起来很整洁......)
有没有办法RadioButton在Android 中获取s 的数组(或集合)RadioGroup?我想将单个侦听器添加到单选按钮,但我没有看到任何明显的迭代方法.
给出一个清单
a = [0,1,2,3,4,5,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到
b = [0,9,1,8,2,7,3,6,4,5]
Run Code Online (Sandbox Code Playgroud)
也就是说,产生一个新的列表,其中每个连续的元素交替地从原始列表的两边取出?
我不知道该搜索什么.我发现重命名地图迭代器的第一个和第二个,但它不是我想要做的.
这是我想要做的[见下面的无意义的C++代码].有可能接近这个吗?否则将只需要选择"调整"迭代器作为循环内部的第一行我想.
// what I want to do:
std::map<int, std::string> my_map;
// ... populate my_map
for(auto key, auto & value: my_map){
// do something with integer key and string value
}
Run Code Online (Sandbox Code Playgroud)
C++ 11很好,但如果可能,请避免使用.
我得到的最接近的是
// TODO, can this be templated?
struct KeyVal{
int & id;
std::string & info;
template <typename P>
KeyVal(P & p)
: id(p.first)
, info(p.second)
{
}
};
//...
for ( KeyVal kv : my_map ){
std::cout << kv.info;
}
Run Code Online (Sandbox Code Playgroud)
但这意味着为每个地图编写一个适配器类:(
// slightly joke answer/"what …Run Code Online (Sandbox Code Playgroud) iteration ×10
python ×3
c++ ×2
dictionary ×2
jquery ×2
list ×2
recursion ×2
algorithm ×1
android ×1
arrays ×1
c++11 ×1
containers ×1
counter ×1
generics ×1
java ×1
javascript ×1
json ×1
loops ×1
object ×1
optimization ×1
performance ×1
radio-button ×1
radio-group ×1
readability ×1