我正在使用列表'a'做这样的事情:
a.each_with_index |outer, i|
a.each_with_index |inner, j|
if(j > i)
# do some operation with outer and inner
end
end
end
Run Code Online (Sandbox Code Playgroud)
如果迭代器不会使用相同的顺序,这将不起作用.我不关心命令究竟是什么,我只需要两个.each_with_index迭代器来使用相同的顺序.
我会假设它是一个数组的属性,它有一个固定的顺序,我只是偏执,迭代器不会使用该顺序...
我需要通过确定每个选项卡组件的内容来确定JTabbedPane中哪些选项卡需要更新.根据我的判断,无法使用默认的JTabbedPane模型遍历每个选项卡.
有没有人对我在这种情况下能做些什么有任何想法?
我无意在实际代码中使用它.我承诺.
std当函数参数是类型container::iterator且container::iterator不是typedef内置类型时,标准是否保证找到命名空间?
例如
#include <set>
#include <algorithm>
int main()
{
std::set<int> s;
find(s.begin(), s.end(), 0); //do I have a guarantee that std::find will be found?
}
Run Code Online (Sandbox Code Playgroud)
换句话说,迭代器类是否可以在stdADL不考虑的命名空间中定义?
提前致谢.
基本上,用户提交Iterator在ArrayList中搜索的String.找到时,Iterator将删除包含String的对象.
因为这些对象中的每一个都包含两个字符串,所以我发现将这些行写成一个就很麻烦了.
Friend current = it.next();
String currently = current.getFriendCaption();
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
任何人都可以解释为什么这些迭代器的行为不同?我通常希望String表现得像IndexedSeq[Char].这记录在哪里?
val si: Iterator[Char] = "uvwxyz".iterator
val vi: Iterator[Char] = "uvwxyz".toIndexedSeq.iterator
val sr = for (i <- 1 to 3)
yield si take 2 mkString
//sr: scala.collection.immutable.IndexedSeq[String] = Vector(uv, uv, uv)
val vr = for (i <- 1 to 3)
yield vi take 2 mkString
//vr: scala.collection.immutable.IndexedSeq[String] = Vector(uv, wx, yz)
Run Code Online (Sandbox Code Playgroud) 我试图从Iterator对象中过滤特定元素,我可以通过iterator.remove()方法删除false元素.
这是我的方法存根:
private static Iterator<A> process(Iterator<A> iter, Per p) {
while(iter.hasNext()){
A o = iter.next();
if(p.per(o)){
iter.remove();
}
}
return iter;
}
Run Code Online (Sandbox Code Playgroud)
我可以删除不相关的元素,但是当我查看Iterator.reomve()的java api时,它会说:
void remove():从底层集合中移除迭代器返回的最后一个元素(可选操作).每次调用next时,只能调用一次此方法.如果在迭代正在进行中以除调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为.
我只是想知道为什么它是一个可选的操作?在使用remove()方法时让程序员更加小心是一个警告吗?还是有其他含义?
感谢大家提前寻求帮助.
我正在编译的整个代码在下面供您参考:
package com.test.iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorTest {
public static void main(String[] args) {
final IteratorTest it = new IteratorTest();
List<A> list = new ArrayList<A>(){{
add(it.new A(10));
add(it.new A(11));
add(it.new A(12));
add(it.new A(13));
add(it.new A(16));
}};
Iterator<A> iter = list.iterator();
iter = process(iter, …Run Code Online (Sandbox Code Playgroud) 所以,我正在尝试定义一个宏来简化以下代码:
for (vector<TYPE>::iterator iter = iterable.begin();
iter != iterable.end(); iter++)
Run Code Online (Sandbox Code Playgroud)
和
for (map<TYPE, TYPE>::iterator iter = iterable.begin();
iter != iterable.end(); iter++)
Run Code Online (Sandbox Code Playgroud)
等等
到目前为止,我已经有了
#define every(iter, iterable) ::iterator iter = iterable.begin(); iter != iterable.end(); iter++
for (vector<TYPE> every(iter, iterable))
Run Code Online (Sandbox Code Playgroud)
但我想进一步简化这一点.
理想情况下,我希望能够做到
for (every(iter, iterable))
Run Code Online (Sandbox Code Playgroud)
这意味着我需要以某种方式获得class<TYPE>可迭代对象.这可能吗?如果是这样,我该怎么办?
iterator对象的(相对)大型代码库.#define every(iter, iterable) typeof(iterable.begin()) iter = iterable.begin(); iter != iterable.end(); iter++
for (every(iter, iterable))
Run Code Online (Sandbox Code Playgroud) 在我的班上,我有两个私人成员:
std::list<MyObject> objects;
MyObject *selecteObj;
Run Code Online (Sandbox Code Playgroud)
当一个事件发生时,我想遍历列表并运行某种测试,只会在列表中的一个项目上产生true.我想保存一个指向该项目的指针,以便在别处使用.
std::list<MyObject>::iterator i;
for (i = objects.begin(); i!=objects.end(); ++i){
if (i->test())
selectedObj = i;
}
Run Code Online (Sandbox Code Playgroud)
在其他地方另一种方法
if (selectedObj !=null)
tmpObj->doSomething();
Run Code Online (Sandbox Code Playgroud)
但是这不起作用,因为i它不是指针,它是一个迭代器,即使你可以像对待指针一样对待它MyObject.
是否可以检索迭代器内部存储的指针以供在别处使用?
我错误地想到了这个吗?
完成我想要做的事情的正确方法是什么?
在我目前的C++项目中,我有一个STL映射,它将整数键映射到对象上.算法返回一组条目.返回的数据取决于算法的输入,因此无法预测:
class MyClass
{
//...
};
int myAlgorithm(vector<int>::iterator inputIt)
{
// return a key for myMap which is calculated by the current value of inputData
}
int main(int argc, char *argv[])
{
vector<int> inputData;
map<int, MyClass> myMap;
//<fill map with some data>
//<fill inputData>
vector<MyClass> result;
for (vector<int>::iterator it = inputData.begin(); it != inputData.end(); it++)
{
int myMapKey = myAlgorithm(*it);
// count() > 0 means "check whether element exists. Performance can be improved by replacing
// the operator[] and count() …Run Code Online (Sandbox Code Playgroud) 如果我有一个std::vector<int>,我可以通过减去两个迭代器来获得最小元素的索引:
int min_index = std::min_element(vec.begin(), vec.end()) - vec.begin();
Run Code Online (Sandbox Code Playgroud)
但是,对于没有随机访问迭代器的容器,例如a std::list<int>,这不起作用.当然,有可能做类似的事情
int min_index = std::difference(l.begin(), std::min_element(l.begin(), l.end()));
Run Code Online (Sandbox Code Playgroud)
但是我必须在列表中迭代两次.
我可以通过在列表中迭代一次来获取具有STL算法的最小值的元素的索引,还是必须编写自己的for循环代码?