来自C背景我总是用于int i泛型循环变量.当然,在大型嵌套循环或其他复杂的东西中,我可能会使用一个描述性的名称但你更喜欢看哪一个?
int i;
for(i=0;i<Controls.Count;i++){
DoStuff(Controls[i]);
}
Run Code Online (Sandbox Code Playgroud)
要么
int index;
for(index=0;index<Controls.Count;index++){
DoStuff(Controls[index]);
}
Run Code Online (Sandbox Code Playgroud)
在我正在进行的当前项目中,这两种样式和索引都被替换为ndx.
哪一个更好?是i可变太一般?还有其他C风格的名字呢?i, j, k是否所有这些都应该被实际的描述性变量所取代?
我发现允许修改值类型中的迭代器方法this.
但是,由于CLR的限制,调用方法看不到修改.(this按值传递)
因此,迭代器和非迭代器中的相同代码会产生不同的结果:
static void Main() {
Mutable m1 = new Mutable();
m1.MutateWrong().ToArray(); //Force the iterator to execute
Console.WriteLine("After MutateWrong(): " + m1.Value);
Console.WriteLine();
Mutable m2 = new Mutable();
m2.MutateRight();
Console.WriteLine("After MutateRight(): " + m2.Value);
}
struct Mutable {
public int Value;
public IEnumerable<int> MutateWrong() {
Value = 7;
Console.WriteLine("Inside MutateWrong(): " + Value);
yield break;
}
public IEnumerable<int> MutateRight() {
Value = 7;
Console.WriteLine("Inside MutateRight(): " + Value);
return new int[0];
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Inside …
我没有完全掌握python迭代器,我得到了一个带有子列表的对象,我想迭代这个结构.我想获得与printall函数相同的行为,但使用迭代器.
class t:
def __init__(self, i):
self.l = []
self.a = 0
for ii in range(i):
self.a = ii
self.l.append(t(i-1))
def __iter__(self):
return self
def next(self):
for i in self.l:
yield i.__iter__()
yield self
def printall(self):
for i in self.l:
i.printall()
print self.a
Run Code Online (Sandbox Code Playgroud)
希望有足够的信息,谢谢
编辑:
我只是希望能够遍历树的所有叶子并对对象做一些事情,即当我有一个实例时
bla = t(3)
Run Code Online (Sandbox Code Playgroud)
我希望能够通过每个节点
for x in bla:
print x.a
Run Code Online (Sandbox Code Playgroud)
例如.我想能够与每个x,我只需要访问每个孩子一次
变种a:
const auto end = whatever.end();
for (auto it = whatever.begin(); it != end; ++it)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
变式b:
const auto end = whatever.cend(); // note the call to cend insteand of end here
for (auto it = whatever.begin(); it != end; ++it)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
有没有理由相信变量b的效率低于变量a,因为循环条件比较了两种不同类型的迭代器?这会导致隐式转换it吗?
(end在for循环中多次使用,因此我希望将其提升.)
假设我想根据一些标准删除项目.让我们说:
QMap<int, int> map;
Run Code Online (Sandbox Code Playgroud)
我想删除所有值为奇数的项目.如果我使用迭代器:
for (auto it = map.begin(); it != map.end(); ++it)
if (it.value() % 2 == 1)
map.remove(it.key());
Run Code Online (Sandbox Code Playgroud)
这个代码可能是错的,因为调用了
map.remove(it.key())
Run Code Online (Sandbox Code Playgroud)
使迭代器无效.如何在每次删除后不重置迭代器的情况下执行此操作?
我有一个结构"MachineState",我创建了一个类型为"MachineState*"的列表.当我尝试迭代列表时我继续"
error C2839: invalid return type 'MachineState **' for overloaded 'operator ->
Run Code Online (Sandbox Code Playgroud)
我正在使用Microsoft Visual Studio 10.我搜索了错误,我发现的所有内容是" - - 运算符必须返回一个类,结构或联合,或者引用一个."
Struct MachineState
{
template <typename MachineTraits>
friend class Machine;
enum Facing { UP, RIGHT, DOWN, LEFT};
MachineState()
: m_ProgramCounter(1)
, m_ActionsTaken(0)
, m_Facing(UP)
, m_Test(false)
, m_Memory(nullptr)
,x(0)
,y(0)
,point1(25, 10)
,point2(10, 40)
,point3(40, 40)
{ }
int m_ProgramCounter;
int m_ActionsTaken;
Facing m_Facing;
bool m_Test;
int x;
int y;
Point point1;
Point point2;
Point point3;
};
Run Code Online (Sandbox Code Playgroud)
我将列表声明为
std::list<MachineState*> zombs;
Run Code Online (Sandbox Code Playgroud)
这里是我尝试迭代我的列表并且我继续得到错误,在"it-> point1"上说表达式必须有一个指向类类型的指针. …
我使用下面的代码找到一个字符串std::vector的string类型.但是如何返回特定元素的位置?
码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<string> vec;
vector<string>::iterator it;
vec.push_back("H");
vec.push_back("i");
vec.push_back("g");
vec.push_back("h");
vec.push_back("l");
vec.push_back("a");
vec.push_back("n");
vec.push_back("d");
vec.push_back("e");
vec.push_back("r");
it=find(vec.begin(),vec.end(),"r");
//it++;
if(it!=vec.end()){
cout<<"FOUND AT : "<<*it<<endl;
}
else{
cout<<"NOT FOUND"<<endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
FOUND AT : r
预期产出:
FOUND AT : 9
为了fun and profit™,我正在用C++编写一个trie类(使用C++ 11标准.)
我trie<T>有一个迭代器,trie<T>::iterator.(它们实际上都是函数 const_iterator s,因为你无法修改trie value_type.)迭代器的类声明看起来像这样:
template<typename T>
class trie<T>::iterator : public std::iterator<std::bidirectional_iterator_tag, T> {
friend class trie<T>;
struct state {
state(const trie<T>* const node, const typename std::vector<std::pair<typename T::value_type, std::unique_ptr<trie<T>>>>::const_iterator& node_map_it ) :
node{node}, node_map_it{node_map_it} {}
// This pointer is to const data:
const trie<T>* node;
typename std::vector<std::pair<typename T::value_type, std::unique_ptr<trie<T>>>>::const_iterator node_map_it;
};
public:
typedef const T value_type;
iterator() =default;
iterator(const trie<T>* node) {
parents.emplace(node, node->children.cbegin());
// ...
}
// ...
private:
std::stack<state> …Run Code Online (Sandbox Code Playgroud) 我有let my_vec = (0..25).collect::<Vec<_>>(),我想分成my_vec10组的迭代器:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19];
[20, 21, 22, 23, 24, None, None, None, None, None];
Run Code Online (Sandbox Code Playgroud)
在Rust中使用迭代器可以做到这一点吗?
->*如果重载->,显然不能自动工作,并且必须手动重载.
为什么标准容器迭代器不超载->*除了->,迫使使用(*iter).*mem_ptr代替iter->*mem_ptr?
#include <iostream>
#include <vector>
struct S
{
int x;
};
int main()
{
std::vector<S> vec = {{42}};
auto mem_ptr = &S::x;
std::cout << (*vec.begin()).*mem_ptr << '\n'; // This line compiles.
std::cout << vec.begin()->*mem_ptr << '\n'; // This line doesn't compile.
}
Run Code Online (Sandbox Code Playgroud)