标签: iterator

在c ++中返回指向vector元素的指针

我在全局范围内有一个myObjects的向量.我有一个方法,它使用a std::vector<myObject>::const_iterator遍历向量,并进行一些比较以找到一个特定的元素.一旦找到了必需的元素,我希望能够返回指向它的指针(向量存在于全局范围内).

如果我返回&iterator,我是否返回迭代器的地址或迭代器指向的地址?

我需要将const_iterator背面强制转换为myObject,然后返回该地址吗?

c++ containers pointers iterator

60
推荐指数
3
解决办法
10万
查看次数

什么是迭代器的默认值?

对于我正在使用的任何STL容器,如果我使用迭代器的默认构造函数声明一个迭代器(此特定容器类型),迭代器将初始化为什么?

例如,我有:

std::list<void*> address_list;
std::list<void*>::iterator iter;
Run Code Online (Sandbox Code Playgroud)

什么会被初始化?

c++ containers iterator stl default

60
推荐指数
3
解决办法
5万
查看次数

计算生成器/迭代器中项目数的最短方法是什么?

如果我想要迭代中的项目数量而不关心元素本身,那么获得该元素的pythonic方法是什么?现在,我会定义

def ilen(it):
    return sum(itertools.imap(lambda _: 1, it))    # or just map in Python 3
Run Code Online (Sandbox Code Playgroud)

但我明白lambda接近被认为是有害的,lambda _: 1当然不是很漂亮.

(这个用例是计算匹配正则表达式的文本文件中的行数,即grep -c.)

python iterator iterable generator

60
推荐指数
5
解决办法
3万
查看次数

c ++ 11 foreach语法和自定义迭代器

我正在编写一个用于代替STL容器的容器的迭代器.目前,STL容器正在许多地方使用c ++ 11 foreach语法,例如:for(auto &x: C).我们需要更新代码以使用包装STL容器的自定义类:

template< typename Type>
class SomeSortedContainer{
    std::vector<typename Type> m_data; //we wish to iterate over this
    //container implementation code
};    
class SomeSortedContainerIterator{
    //iterator code
};
Run Code Online (Sandbox Code Playgroud)

如何让自动为自定义容器使用正确的迭代器,以便能够以下列方式调用代码?:

SomeSortedContainer C;
for(auto &x : C){
    //do something with x... 
}
Run Code Online (Sandbox Code Playgroud)

一般来说,确保auto为类使用正确的迭代器需要什么?

c++ iterator c++11

59
推荐指数
3
解决办法
5万
查看次数

为什么接下来会提出'StopIteration',但'for'会做出正常的回报?

在这段代码中,为什么使用'for'会导致没有'StopIteration'或'for'循环捕获所有异常然后以静默方式退出?在这种情况下,为什么我们有无关的"回归"?或者是 for由:StopIteration

#!/usr/bin/python3.1
def countdown(n):
    print("counting down")
    while n >= 9:
        yield n
        n -= 1
    return

for x in countdown(10):
    print(x)

c = countdown(10)
next(c)
next(c)
next(c)
Run Code Online (Sandbox Code Playgroud)

假设for是由以下方式触发:return.GeneratorExit何时生成?

def countdown(n):
    print("Counting down from %d" % n)
    try:
        while n > 0:
            yield n
            n = n - 1
    except GeneratorExit:
        print("Only made it to %d" % n)
Run Code Online (Sandbox Code Playgroud)

如果我手动执行:

c = countdown(10)
c.close() #generates GeneratorExit??
Run Code Online (Sandbox Code Playgroud)

在哪种情况下,为什么我看不到追溯?

python iterator generator stopiteration

59
推荐指数
1
解决办法
8万
查看次数

为什么借用的范围不是迭代器,但范围是?

范围如何被消耗的一个例子是:

let coll = 1..10;
for i in coll {
    println!("i is {}", &i);
}
println!("coll length is {}", coll.len());
Run Code Online (Sandbox Code Playgroud)

这将失败

error[E0382]: borrow of moved value: `coll`
   --> src/main.rs:6:35
    |
2   |     let coll = 1..10;
    |         ---- move occurs because `coll` has type `std::ops::Range<i32>`, which does not implement the `Copy` trait
3   |     for i in coll {
    |              ----
    |              |
    |              `coll` moved due to this implicit call to `.into_iter()`
    |              help: consider borrowing to avoid moving …
Run Code Online (Sandbox Code Playgroud)

iterator reference rust

59
推荐指数
2
解决办法
3838
查看次数

为什么在类上定义__getitem__使它在python中可迭代?

为什么在类上定义__getitem__使其可迭代?

例如,如果我写:

class b:
  def __getitem__(self, k):
    return k

cb = b()

for k in cb:
  print k
Run Code Online (Sandbox Code Playgroud)

我得到输出:

0
1
2
3
4
5
6
7
8
...
Run Code Online (Sandbox Code Playgroud)

我真的希望看到"for c in cb:"中返回的错误

python iterator overloading

58
推荐指数
5
解决办法
2万
查看次数

自定义容器应该有免费的开始/结束功能吗?

当创建一个按照通常规则播放的自定义容器类(即使用STL算法,使用性能良好的通用代码等)时,在C++ 03中实现迭代器支持和成员开始/结束函数就足够了.

C++ 11引入了两个新概念 - 基于范围的for循环和std :: begin/end.基于范围的for循环理解成员开始/结束函数,因此任何C++ 03容器都支持基于范围的开箱即用.对于算法,推荐的方法(根据Herb Sutter的'Writing modern C++ code')是使用std :: begin而不是member function.

但是,此时我不得不问 - 是否建议调用完全限定的begin()函数(即std :: begin(c))或依赖ADL并调用begin(c)?

在这种特殊情况下,ADL似乎毫无用处 - 因为如果可能的话,std :: begin(c)委托给c.begin(),通常的ADL好处似乎不适用.如果每个人都开始依赖ADL,那么所有自定义容器都必须在其必需的命名空间中实现额外的begin()/ end()自由函数.但是,有几个消息来源似乎暗示对开始/结束的不合格调用是推荐的方式(即https://svn.boost.org/trac/boost/ticket/6357).

那么C++ 11的方式是什么?容器库作者是否应该为其类编写额外的开始/结束函数,以便在没有使用namespace std的情况下支持不合格的开始/结束调用; 或者使用std :: begin;?

c++ containers iterator argument-dependent-lookup c++11

58
推荐指数
1
解决办法
4928
查看次数

正在弃用的std :: iterator的准备工作

3月21 ,标准委员会投票赞成批准P0174std::iterator提议的弃用:

对于读者而言,很长的void参数序列不仅仅是简单地typedef在类定义本身中提供预期的s,这是当前工作草案采用的方法,遵循设置的模式

之前std::iterator,鼓励继承从迭代器样板实现中删除乏味.但弃用将需要以下其中一项:

  1. 迭代器样板现在需要包含所有必需的typedefs
  2. 使用迭代器的算法现在需要使用auto而不是依赖于迭代器来声明类型
  3. 洛基阿斯塔曾建议std::iterator_traits,可以更新,而继承工作std::iterator

有人可以告诉我我应该期待哪些选项,因为我设计了自定义迭代器,着眼于兼容性?

c++ standards iterator deprecated c++17

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

什么更快,用vector :: iterator或with()迭代STL向量?

在性能方面,什么会更快?有区别吗?它是平台依赖的吗?

//1. Using vector<string>::iterator:
vector<string> vs = GetVector();

for(vector<string>::iterator it = vs.begin(); it != vs.end(); ++it)
{
   *it = "Am I faster?";
}

//2. Using size_t index:
for(size_t i = 0; i < vs.size(); ++i)
{
   //One option:
   vs.at(i) = "Am I faster?";
   //Another option:
   vs[i] = "Am I faster?";
}
Run Code Online (Sandbox Code Playgroud)

c++ performance iterator stl vector

57
推荐指数
6
解决办法
6万
查看次数