标签: iterator

Java迭代器在参数化类型的空集合上

在Java中,我需要从我的方法返回一个Iterator.我的数据来自另一个通常可以给我一个迭代器的对象,所以我可以返回它,但在某些情况下,底层数据为null.为了保持一致性,我希望在这种情况下返回一个"空"迭代器,这样我的调用者就不必测试null.

我想写一些类似的东西:

public Iterator<Foo> iterator() {
   if (underlyingData != null) {
      return underlyingData.iterator();  // works
   } else {
      return Collections.emptyList().iterator();  // compiler error
   }
}
Run Code Online (Sandbox Code Playgroud)

但Java编译器抱怨返回Iterator<Object>而不是Iterator<Foo>.施法(Iterator<Foo>)也不起作用.

java collections iterator

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

如何擦除和删除存储在向量中的对象的指针?

我有一个向量存储指向动态实例化的许多对象的指针,我正在尝试迭代向量并删除某些元素(从向量中移除并销毁对象),但我遇到了麻烦.这是它的样子:

    vector<Entity*> Entities;
    /* Fill vector here */
    vector<Entity*>::iterator it;
    for(it=Entities.begin(); it!=Entities.end(); it++)
        if((*it)->getXPos() > 1.5f)
            Entities.erase(it);
Run Code Online (Sandbox Code Playgroud)

当任何实体对象到达xPos> 1.5时,程序崩溃并出现断言错误......任何人都知道我做错了什么?

我正在使用VC++ 2008.

c++ iterator vector erase visual-c++

30
推荐指数
2
解决办法
8万
查看次数

收集更改后,STL迭代器是否保证有效性?

假设我有一些集合,我在它的开头就获得了一个迭代器.现在让我们说我修改了这个集合.无论集合的类型还是迭代器,我还能安全地使用迭代器吗?

为避免混淆,这是我谈到的操作顺序:

  1. 获取集合的迭代器.
  2. 修改集合(显然不是其中的元素,而是集合本身).
  3. 使用在步骤1中获得的迭代器.根据STL标准,它是否有效?!

c++ containers iterator stl

30
推荐指数
2
解决办法
8440
查看次数

测试迭代器是否指向最后一项?

我有一个由std :: find()生成的stl迭代器,并希望测试它是否是最后一个元素.写这个的一种方法如下:

mine *match = someValue;
vector<mine *> Mine(someContent);
vector<mine *>::iterator itr = std::find(Mine.begin(), Mine.end(), match);

if (itr == --Mine.end()) {
  doSomething;
}
Run Code Online (Sandbox Code Playgroud)

但在我看来,递减end()迭代器是在寻求麻烦,例如如果向量没有元素,那么它将是未定义的.即使我知道它永远不会是空的,它仍然看起来很难看.我想也许rbegin()是可行的方法,但我不确定将前向迭代器与反向迭代器进行比较的最佳方法.

c++ iterator stl

30
推荐指数
4
解决办法
4万
查看次数

如何在C++中从迭代器中检索值类型?

对于熟悉C++语法的人来说,我的问题肯定是一个简单的问题.我只是在学习c ++,这是一种功课.

template<typename Iter>
void quickSort(Iter begin, Iter end)
{        
    //..
    auto pivot = * ( begin + (end - begin)/2 );
    //..
}
Run Code Online (Sandbox Code Playgroud)

pivot应该包含来自[begin,end]间隔中心的值.Ite我写的代码有效,但它auto是一个新的语言标准的关键字.怎么做老路?写什么而不是auto

c++ iterator

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

如何检查传递的Iterator是一个随机访问迭代器?

我有以下代码,它执行一些迭代器算术:

template<class Iterator>
void Foo(Iterator first, Iterator last) {
  typedef typename Iterator::value_type Value;
  std::vector<Value> vec;
  vec.resize(last - first);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

(last - first)表达的作品(据我所知)仅适用于随机访问迭代器(像的那些vectordeque).如何检查传递的迭代器满足此要求的代码?

c++ iterator stl

30
推荐指数
2
解决办法
6210
查看次数

如何在Python中一次读取N行文件?

我需要一次读取最多N行读取一个大文件,直到EOF.在Python中最有效的方法是什么?就像是:

with open(filename, 'r') as infile:
    while not EOF:
        lines = [get next N lines]
        process(lines)
Run Code Online (Sandbox Code Playgroud)

python file-io iterator

30
推荐指数
3
解决办法
4万
查看次数

异步迭代器任务<IEnumerable <T >>

我正在尝试实现一个返回迭代器的异步函数.这个想法如下:

    private async Task<IEnumerable<char>> TestAsync(string testString)
    {
        foreach (char c in testString.ToCharArray())
        {
            // do other work
            yield return c;
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,有一个错误消息,该函数不能是迭代器块,因为Task<IEnumerable<char>>它不是迭代器接口类型.有解决方案吗?

.net c# clr iterator asynchronous

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

const_iterator与迭代器的比较是否定义明确?

请考虑以下代码:

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> vec{1,2,3,5};
    for(auto it=vec.cbegin();it!=vec.cend();++it)
    {
        std::cout << *it;
        // A typo: end instead of cend
        if(next(it)!=vec.end()) std::cout << ",";
    }
    std::cout << "\n";
}
Run Code Online (Sandbox Code Playgroud)

在这里我介绍了一个错字:在比较中我打电话vec.end()而不是vec.cend().这似乎与gcc 5.2一样有效.但根据标准,它实际上是否定义明确?能iteratorconst_iterator安全地进行比较?

c++ iterator const-iterator comparison-operators

30
推荐指数
3
解决办法
2635
查看次数

什么是迭代器?

当我尝试使用接受"general iterator"的ctor编写C++类模板时,会出现此问题.我不知道在这里使用general这个词是否合适,但我的意思是它可以像STL容器一样接受迭代器.

换句话说,我对迭代器感到困惑.似乎所有STL容器都具有相同类型的迭代器,那么该类型是什么?它只是指针吗?还是更复杂的东西?但是STL容器确实接受普通指针.

(我想将它与Iterator<T>in 进行比较Java,这很简单,只是一个类)

c++ iterator

30
推荐指数
2
解决办法
3571
查看次数