dict方法dict.keys(),dict.items()和dict.values()返回"views"而不是list. http://docs.python.org/dev/3.0/whatsnew//3.0.html
首先,视图与迭代器有何不同?其次,这种变化有什么好处?这只是出于性能原因吗?
这对我来说似乎不太直观,也就是说,我要求列出一些东西(给我所有的钥匙),然后我又得到了别的东西.这会让人迷惑吗?
这对你们中的一些人来说可能看起来很无聊,但是对于STL容器,以下哪两种迭代方法更好?为什么?
class Elem;
typedef vector<Elem> ElemVec;
ElemVec elemVec;
// Method 0
for (ElemVec::iterator i = elemVec.begin(); i != elemVec.end(); ++i)
{
Elem& e = *i;
// Do something
}
// Method 1
for (int i = 0; i < elemVec.size(); ++i)
{
Elem& e = elemVec.at(i);
// Do something
}
Run Code Online (Sandbox Code Playgroud)
方法0似乎更清晰STL,但方法1使用较少的代码实现相同.在容器上简单重复的事情似乎都在以任何源代码的地方.所以,我倾向于选择方法1,这似乎可以减少视觉混乱和代码大小.
PS:我知道迭代器可以做的不仅仅是一个简单的索引.但是,请将回复/讨论集中在如上所示的容器上的简单迭代上.
我试图用Joda时间实现一个没有成功的Date迭代器.
我需要一些东西,允许我从startDate到endDate的所有日子迭代
您是否知道如何做到这一点?
输入迭代器和只读前向迭代器之间有什么区别?
因为后者是只读的,所以它们显然不满足输出迭代器的要求.而且,正因为如此,它们才能有效地输入迭代器并提供额外的保证(如果有的话).问题是,有什么额外的保证?
我的猜测是前向迭代器是多次传递而输入迭代器不是,我是对的吗?
我不是在寻找解决方案,我正在寻找更好的解决方案,或者通过使用其他类型的列表理解或其他方式来寻找更好的解决方案.
我需要生成一个2个整数的元组列表来获取地图坐标,如[(1,1),(1,2),...,(x,y)]
所以我有以下内容:
width, height = 10, 5
Run Code Online (Sandbox Code Playgroud)
解决方案1
coordinates = [(x, y) for x in xrange(width) for y in xrange(height)]
Run Code Online (Sandbox Code Playgroud)
解决方案2
coordinates = []
for x in xrange(width):
for y in xrange(height):
coordinates.append((x, y))
Run Code Online (Sandbox Code Playgroud)
解决方案3
coordinates = []
x, y = 0, 0
while x < width:
while y < height:
coordinates.append((x, y))
y += 1
x += 1
Run Code Online (Sandbox Code Playgroud)
还有其他解决方案吗?我最喜欢第一个.
我有一个用例,我需要迭代Vector元素并将结果存储在say数组中,只要该实例是类method
这有什么容易的吗?
目前我这样做:
Iterator itr = vec.iterator();
Iterator element = vec.iterator();
while(itr.hasNext())
{
boolean method = itr.next() instanceof Method;
if(method)
System.out.println( "\t" + ( (Method)(element.next()) ).name);
else
element.next();
}
Run Code Online (Sandbox Code Playgroud)
但我认为会有比这更好的方法.
例如:我有A的列表,我想在它的字段a上计算平均值.最好的方法是什么?我找到的愚蠢的解决方案是创建LAverage = new List(),用所有La填充它并调用LAverage.average()
class A
{
int a;
int b;
}
void f()
{
var L = new List<A>();
for (int i=0; i<3; i++)
{
L.Add(new A(){a = i});
}
}
Run Code Online (Sandbox Code Playgroud) for i in range (0, 81):
output = send command
while True:
last_byte = last_byte - offset
if last_byte > offset:
output = send command
i+
else:
output = send command
i+
break
Run Code Online (Sandbox Code Playgroud)
我想在每次执行send命令时增加迭代器.现在它只在执行for循环时增加1.请指教
for i in range(0,10):
print(i)
i +=2
print("increased i", i)
Run Code Online (Sandbox Code Playgroud)
我运行了这段代码,它从0到9生成.我原以为它会将迭代器增加2.
参见,例如, http ://en.cppreference.com/w/cpp/container/map/erase
在C++ 03中有三个重载:
void erase( iterator pos );
void erase( iterator first, iterator last );
size_type erase( const key_type& key );
Run Code Online (Sandbox Code Playgroud)
在C++ 11中,第一和第二过载改变为采取const_iterator,使得它们可与任一被调用iterator或const_iterator.第一次重载也通过在删除之后将迭代器返回到元素来改进:
iterator erase( const_iterator pos );
void erase( const_iterator first, const_iterator last );
size_type erase( const key_type& key );
Run Code Online (Sandbox Code Playgroud)
在C++ 17中,重新引入了非const重载:
iterator erase( const_iterator pos );
iterator erase( iterator pos );
void erase( const_iterator first, const_iterator last );
size_type erase( const key_type& key );
Run Code Online (Sandbox Code Playgroud)
为什么需要这个?它不加入为不等erase,也不是为insert …
iterator ×10
c++ ×4
java ×2
python ×2
python-3.x ×2
stl ×2
.net ×1
average ×1
c# ×1
c++17 ×1
containers ×1
coordinates ×1
date ×1
dictionary ×1
dictview ×1
for-loop ×1
jodatime ×1
mean ×1
stdmap ×1