有没有办法重命名map迭代器的第一个和第二个访问器函数.我知道他们有这些名称是因为代表键和值的底层对,但我希望迭代器更具可读性.我认为这可能是使用迭代器适配器,但我不知道如何实现它.
请注意,我不能使用提升.
我的意思是:
map<Vertex, Edge> adjacency_list;
for(map<Vertex, Edge>::iterator it = adjacency_list.begin();
it != adjacency_list.end();
++it)
{
Vertex v = it->first;
//instead I would like to have it->vertex
}
Run Code Online (Sandbox Code Playgroud) 我想将一个std :: map的内容复制到另一个.我可以用std::copy它吗?显然,以下代码不起作用:
int main() {
typedef std::map<int,double> Map;
Map m1;
m1[3] = 0.3;
m1[5] = 0.5;
Map m2;
m2[1] = 0.1;
std::copy(m1.begin(), m1.end(), m2.begin());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这不会因为工作copy会叫operator*上m2.begin()为"解引用",并分配一个值(所有值的类型的std::pair<const int, double>).然后它将调用operator++移动到下一个空间m2.这两个操作都因为constin const int而无法工作,并且没有为任何新元素保留空间.
有没有办法让它适用std::copy?
谢谢!
我编写了以下代码来从对象"弹出"一个属性,就像它是一个数组一样.这看起来像是会让我被更严肃的程序员打耳光的那种代码,所以我想知道这样做的正确方法是什么:
// wrong way to pop:
for( key in profiles ){
var profile = profiles[key]; // get first property
profiles[key] = 0; // Save over property just in case "delete" actually deletes the property contents instead of just removing it from the object
delete profiles[key]; // remove the property from the object
break; // "break" because this is a loop
}
Run Code Online (Sandbox Code Playgroud)
我应该在上面提到过,与真正的"pop"不同,我不需要以任何特定的顺序出现这些对象.我只需要取出一个并将其从父对象中删除.
如何const_iterator从iteratorC++中获取a ?怎么样一个const_iterator从insert_iterator?结果iterator应该指向与原始位置相同的位置.
我有一组对象.每个对象都有String值.
我需要选择所有this值等于"方向"的对象.
是否可以不迭代集合?
谢谢.
考虑在迭代时从关联容器中删除元素的规范算法:
for (auto iter = myMap.begin(); iter != myMap.end(); )
{
if (/* removal condition */)
{
iter = myMap.erase(iter);
}
else
{
++iter;
}
}
Run Code Online (Sandbox Code Playgroud)
在使用C++ 11 std::unordered_map容器时,我一直在不加思索地应用这个算法.但是,在浏览cppreference.comstd::unordered_map::erase上的文档之后,在阅读以下注释后我变得有点担心:
保留未擦除元素的顺序(这使得可以在迭代容器时擦除单个元素)(从C++ 14开始)
基于这个陈述,我假设在C++ 14标准中添加了语言,以确保库实现者在调用后保证排序std::unordered_map::erase.例如,这样的要求可能会限制实现在删除元素后不重新整理整个容器,而只是允许它从相应的存储桶中删除元素?
如果我在C++ 11中没有这样的保证,并且如果我希望我的代码是可移植的,那么如果我std::unordered_map在迭代期间删除一个元素,我是否必须担心一些元素会被访问多次或根本不访问?
我用Java8 定义natural了Stream自然数的无限序列()iterator.
IntStream natural = IntStream.iterate(0, i -> i + 1);
natural
.limit(10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
现在,我想用Java8定义它generator.
静态流生成(供应商)
什么是最简单的方法?谢谢.
我需要迭代for循环的每次迭代的值集,但只有第一次迭代才能正常工作.此后itr.hasNext()返回false.
Iterator<String> itr = getQuestionIterator(File file);
for(Person p : persons)
{
while(itr.hasNext())
{
String question = itr.next();
........
........
}
}
Run Code Online (Sandbox Code Playgroud)
这种行为对我来说很清楚.
一种解决方案可能是getQuestionIterator(File file)在for循环中调用方法,因此对于每个for循环迭代,它都会重新初始化.但这是非常低效的方法,因为它itr是独立的.
我尝试了这个Iterator<String> temp = itr,但它也没有用,因为它仅保留了参考.
有没有办法将迭代器复制到另一个或任何其他更好的方法?
据我了解,下面的代码应打印true,因为两者Stream并Iterator指向的第一个元素.
但是,当我运行以下代码时,它正在打印false:
final HashMap<String, String> map = new HashMap<>();
map.put("A", "B");
final Set<Map.Entry<String, String>> set = Collections.unmodifiableMap(map).entrySet();
Map.Entry<String, String> entry1 = set.iterator().next();
Map.Entry<String, String> entry2 = set.stream().findFirst().get();
System.out.println(entry1 == entry2);
Run Code Online (Sandbox Code Playgroud)
不同行为的原因是什么?
我如何迭代ruby数组并始终获得两个值,当前和下一个,如:
[1,2,3,4,5,6].pairwise do |a,b|
# a=1, b=2 in first iteration
# a=2, b=3 in second iteration
# a=3, b=4 in third iteration
# ...
# a=5, b=6 in last iteration
end
Run Code Online (Sandbox Code Playgroud)
我的用例:我想测试数组是否已排序,并且通过使用这样的迭代器,我总能比较两个值.
我不是each_slice在这个问题中寻找:将ruby数组转换为连续对的数组