标签: iterator

int i vs int index等哪一个更好?

可能重复:
名为i的变量是否不可接受?
循环变量的理想变量命名约定是什么?

来自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是否所有这些都应该被实际的描述性变量所取代?

variables iterator coding-style naming-conventions

11
推荐指数
3
解决办法
458
查看次数

为什么结构中的迭代器可以修改它?

我发现允许修改值类型中的迭代器方法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 …

.net c# iterator this value-type

11
推荐指数
1
解决办法
759
查看次数

python迭代器通过树与子列表

我没有完全掌握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,我只需要访问每个孩子一次

python iterator

11
推荐指数
3
解决办法
2万
查看次数

迭代器和const_iterator之间的比较是否效率低下?

变种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循环中多次使用,因此我希望将其提升.)

c++ performance iterator const c++11

11
推荐指数
1
解决办法
842
查看次数

如何从QMap中删除值?

假设我想根据一些标准删除项目.让我们说:

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)

使迭代器无效.如何在每次删除后不重置迭代器的情况下执行此操作?

c++ qt iterator

11
推荐指数
2
解决办法
1万
查看次数

表达式必须具有指向类的指针类型

我有一个结构"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"上说表达式必须有一个指向类类型的指针. …

c++ struct pointers iterator list

11
推荐指数
1
解决办法
3万
查看次数

vector <string> :: iterator - 如何查找元素的位置

我使用下面的代码找到一个字符串std::vectorstring类型.但是如何返回特定元素的位置?

码:

#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

c++ iterator stl stdvector

11
推荐指数
1
解决办法
5万
查看次数

C++中的const-correctness语义

为了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)

c++ iterator c++11

11
推荐指数
1
解决办法
576
查看次数

是否可以使用迭代器将矢量拆分为10个组?

我有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中使用迭代器可以做到这一点吗?

iterator vector rust

11
推荐指数
2
解决办法
2950
查看次数

为什么标准容器迭代器不会重载` - >*`?

->*如果重载->,显然不能自动工作,并且必须手动重载.

为什么标准容器迭代器不超载->*除了->,迫使使用(*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)

c++ iterator operator-overloading language-lawyer

11
推荐指数
1
解决办法
169
查看次数