在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>)也不起作用.
我有一个向量存储指向动态实例化的许多对象的指针,我正在尝试迭代向量并删除某些元素(从向量中移除并销毁对象),但我遇到了麻烦.这是它的样子:
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.
假设我有一些集合,我在它的开头就获得了一个迭代器.现在让我们说我修改了这个集合.无论集合的类型还是迭代器,我还能安全地使用迭代器吗?
为避免混淆,这是我谈到的操作顺序:
我有一个由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++语法的人来说,我的问题肯定是一个简单的问题.我只是在学习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?
我有以下代码,它执行一些迭代器算术:
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)表达的作品(据我所知)仅适用于随机访问迭代器(像的那些vector和deque).如何检查传递的迭代器满足此要求的代码?
我需要一次读取最多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) 我正在尝试实现一个返回迭代器的异步函数.这个想法如下:
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>>它不是迭代器接口类型.有解决方案吗?
请考虑以下代码:
#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一样有效.但根据标准,它实际上是否定义明确?能iterator和const_iterator安全地进行比较?
当我尝试使用接受"general iterator"的ctor编写C++类模板时,会出现此问题.我不知道在这里使用general这个词是否合适,但我的意思是它可以像STL容器一样接受迭代器.
换句话说,我对迭代器感到困惑.似乎所有STL容器都具有相同类型的迭代器,那么该类型是什么?它只是指针吗?还是更复杂的东西?但是STL容器确实接受普通指针.
(我想将它与Iterator<T>in 进行比较Java,这很简单,只是一个类)
iterator ×10
c++ ×7
stl ×3
.net ×1
asynchronous ×1
c# ×1
clr ×1
collections ×1
containers ×1
erase ×1
file-io ×1
java ×1
python ×1
vector ×1
visual-c++ ×1