我正在学习C++(和C++ 11)的性能.我需要在调试和发布模式下执行,因为我花时间进行调试和执行.
我对这两个测试感到惊讶,并且对不同的编译器标志优化有多大的改变.
测试迭代器1:
测试迭代器2:
PD:我使用以下时钟代码.
测试迭代器1:
void test_iterator_1()
{
int z = 0;
int nv = 1200000000;
std::vector<int> v(nv);
size_t count = v.size();
for (unsigned int i = 0; i < count; ++i) {
v[i] = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
测试迭代器2:
void test_iterator_2()
{
int z = 0;
int nv = 1200000000;
std::vector<int> v(nv);
for (int& i : v) {
i = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
更新:问题仍然是相同的,但对于-O3中的ranged-for,差异很小.所以对于循环1是最好的.
更新2:结果:
使用-O3:
t1: 80 …Run Code Online (Sandbox Code Playgroud) 我读到在迭代Collection时删除元素的正确方法是这样的(使用迭代器):
List<Integer> list = new ArrayList<Integer>();
list.add(12);
list.add(18);
Iterator<Integer> itr = list.iterator();
while(itr.hasNext()) {
itr.remove();
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到了Exception in thread "main" java.lang.IllegalStateException,我不知道为什么.有人能帮我吗?
我有一个名为SAR的类,它包含一个带有int键值的映射和我的SARdataPoint类型的对象数据值.SARdataPoint类型有一个函数int getDate(),我想为映射中包含的每个对象调用它.我无法绕过如何实现这一目标.我想我很亲密.
class SAR
{
public:
// other attributes removed for compactness
std::map<int, SARdataPoint> data;
}; // end of class SAR
void SAR::printSAR()
{
for(auto iter = this->data.cbegin(); iter != this->data.cend(); ++iter)
{
std::cout << iter->getDate() << '\n'; //incorrect but close?
}
}
Run Code Online (Sandbox Code Playgroud)
有关如何实现这一点的任何想法?
我被一些看似obvoius的东西所吸引,但这不适合我.我们有一个hashSet和Iterator:
Set<String> set = new HashSet<>();
Iterator it = set.iterator();
Run Code Online (Sandbox Code Playgroud)
我知道,迭代器是如何工作的,但对我来说有些奇怪:
Iterator*it = set.iterator();**
*ok,等等.Iterator是一个接口,而不是一个类.那么......?
**好吧,set是HashSet类的一个对象,它实现了接口Iterator,所以ith有一个void interator()imlemented,没什么不寻常的.
但是我们如何从Iterator接口创建Iterator对象?
我有Iterator实例.我必须得到这个的大小.在这里,我得到了条目的大小.平均大小为8.假设我想在此迭代器中仅显示5个值.我该如何实现这一个?
Document<Feed> feeddoc = resp.getDocument();
List<Entry> entries = feeddoc.getRoot().getEntries();
entries = feeddoc.getRoot().getEntries();
Iterator<Entry> iterator = entries.iterator();
int size = entries.size(); //8
while (iterator.hasNext()) {
/* here I am getting 8 values means iterating 8 times but I want to iterate only 5 times */
Entry next = iterator.next();
userDetailsVos = new UserDetailsVos();
userDetailsVos.setTitle(next.getTitle());
final IRI temp = next.getLinkResolvedHref("alternate");
userDetailsVos.setUrl(temp.toString());
userDetailsVos.setTime(next.getContentElement().getFirstChild().getElements().get(5).getText());
System.out.println("(1)--" + next.getTitle());
System.out.println("(2)--" + next.getContentElement().getFirstChild().getElements().get(5).getText());
System.out.println("url: " + temp.toString());
}
Run Code Online (Sandbox Code Playgroud) 使用我当前的方法我得到一个运行时错误,"列出iter not derefrencable".for循环看起来像:
for (iter = the_list.end(); iter != the_list.begin(); iter--)
{
if (assignment >= (*iter)){ // If the assignment being added is greater than assignment being pointed to in the list, add it after
// the assignment being pointed to
if (!(assignment == (*iter))) // If the assignment being added is not a duplicate, add it
{
iter++; // Increment the iterator to add the assignment to place after the one it was compared to
the_list.insert(iter, assignment); // Insert …Run Code Online (Sandbox Code Playgroud) 我需要严格按照元素被推回向量中的顺序进行迭代。对于我的特殊情况,最好使用迭代器,而不是像下面那样通过for-each循环进行迭代:
std::vector<int> vector;
for(int i = 0; i < vector.size(); i++)
//not good, but works
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否真的可以像这样通过迭代器遍历向量:
std::vector<int> v;
for(typename std::vector<int>::iterator i = v.iterator(); i != v.end(); i++)
//good, but I'm not strictly sure about the iterating order.
Run Code Online (Sandbox Code Playgroud)
因此,我可以根据需要安全地使用迭代器吗?它是标准的吗?
我有这样的地图,
Map<String, Map<String, Set<String>>> sampleMap = new Map<String, Map<String, Set<String>>>();
Run Code Online (Sandbox Code Playgroud)
这个地图中的数据就是这样的,
sampleMap={2014={A=[1, 2], B=[3], 2015={A=[1,2], B=[1,2], 2016={A=[1,2], B=[3,4]}};
Run Code Online (Sandbox Code Playgroud)
我想根据这个输入从地图中删除密钥:List<String> filter;这样的值,
filterArray : [2014, 2015]
Run Code Online (Sandbox Code Playgroud)
即,首先逐个遍历arraylist值,验证arraylist值是否与Hashmap中的任何键匹配.
即,我总是希望只保留地图中匹配的键,与传递的输入值进行比较.
在这种情况下,因为我有这样的arraylist值,[2014,2015],
2014,2015键只能在我的地图中.所以,
删除前的数据:
sampleMap={2014={A=[1, 2], B=[3], 2015={A=[1,2], B=[1,2], 2016={A=[1,2], B=[3,4]}};
Run Code Online (Sandbox Code Playgroud)
移动后的数据:
sampleMap={2014={A=[1, 2], B=[3], 2015={A=[1,2], B=[1,2]}};
Run Code Online (Sandbox Code Playgroud)
我试过这种方式,但我只是想知道这是正确的approch,还是容易出现任何异常?
Iterator<Map.Entry<String , Map<String, Set<String>>>> iter = sampleMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String , Map<String, Set<String>>> entry = iter.next();
logger.info("Keys : " + entry.getKey());
if (filterArray.equalsIgnoreCase(entry.getKey())) {
iter.remove();
}
}
Run Code Online (Sandbox Code Playgroud) 以下代码让我困惑:
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> zip(*([iter(a)]*2))
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
>>> iter(a)
<listiterator object at 0x7f3e9920cf50>
>>> iter(a).next()
0
>>> iter(a).next()
0
>>> iter(a).next()
0
Run Code Online (Sandbox Code Playgroud)
next()总是返回0.那么,该iter功能如何工作?
我知道增强的for循环(因为java 1.5)可以用于迭代实现Iterator接口的类类型的集合.然而,它也可以用于迭代基本类型的数组,例如int,boolean,......所以我的逻辑结论是,由于自动装箱和拆箱,例如,原始整数被包装在它们的引用类型中,然后它们将被包含在内.轮到他们,实现Iteratable.
但是,当我查阅文档时java.lang.Integer,没有提到任何可以实现或扩展Iterable接口的超类或接口的扩展或实现.如果没有实现Iterable接口,增强的for循环如何知道如何循环原始类型?