标签: iterator

有选择地禁用已检查的迭代器

我正在编写一个相当复杂的应用程序,它大量使用STL容器.该应用程序有一个相对简单的,性能敏感的部分,可以迭代多个std::maps并执行数千次.测试显示比使用已禁用的已检查迭代器进行编译(_SECURE_SCL设置为0)导致整个程序的速度几乎提高了2倍,完全集中在本节中.

但是,我无法使用_SECURE_SCL设置为0 编译应用程序,因为需要链接使用_SECURE_SCL启用和混合_SECURE_SCL设置编译的库会导致问题.此外,我发现在整个应用程序中使用未经检查的迭代器是相当愚蠢的,因为所有性能敏感位都发生在单个屏幕代码中.那就等于用洗澡水把婴儿扔掉了.

我有哪些选项可以选择性地使用未经检查的迭代器来处理性能敏感的代码/容器,同时保持与使用checked迭代器编译的库的兼容性?

c++ performance iterator stl visual-studio-2008

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

Boost有容器外观吗?

我正在学习如何使用iterator_facade来隐藏迭代器实现的一些样板.在我当前的用例中,我正在包装另一个容器(实际上来自.NET代码)所以我需要begin(),end(),typedef等.至少我希望结果类型与BOOST_FOREACH一起使用.是否有一个方便的东西来提升简化?

c++ containers boost iterator

8
推荐指数
1
解决办法
563
查看次数

了解ML中的foldl

我需要编写一个函数,它接受一个字符串列表并找到列表中最大的字符串.问题是它需要使用List.foldl迭代列表,并且不能使用递归调用,除了List,foldl的库函数中的那些调用.

我写

fun longest_string1(xs)= 
case xs of 
[] => ""  
| x::xs' => List.foldl((fn (s,x) => if String.size s > String.size x then s else x) "" x,)
Run Code Online (Sandbox Code Playgroud)

我的解释如下:

-s in xs,如果xs为空则返回一个空字符串 -

另外xs调用的第一项List.foldl

-List.foldl传入一个匿名函数来检查s的长度,这应该是表示针对列表的head项的累加器.

- 将初始累加器设置为空字符串,将初始比较值设置为高阶函数传入的初始列表的头部

但是,它不进行类型检查.

我认为我的问题在于理解List.foldl函数本身以及它如何读取其参数.有人可以提供一些澄清吗?

iterator functional-programming metalanguage list sml

8
推荐指数
1
解决办法
8506
查看次数

检查std :: vector中是否存在给定索引

我需要索引访问我的std::vector,因此我必须检查索引是否已经可用于首先删除它们,然后设置一个新值.

这是我的setter函数:

void SetVector(int position, int value) {
    std::vector<int>iterator it = testVector.begin();
    // need a check here
    testVector.insert(it-testVector.begin()+position, value);
}
Run Code Online (Sandbox Code Playgroud)

或者这是我的需求错误的C++集合?(应该动态增长,所以std:array不可能).可以使用std::map但也许它也可能std::vector.

c++ iterator vector std

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

如何在我班上允许范围循环?

我有一个这样的课:

class Foo {
private:
    int a,b,c,d;
    char bar;
    double m,n
public:
    //constructors here
};
Run Code Online (Sandbox Code Playgroud)

我想在课堂上允许使用范围循环,例如

Foo foo {/*...*/};
for(auto& f : foo) {
  //f will be a specific order such as c,b,d,(int)m,(int)bar,a,(int)n
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我在看迭代器,但不知道range-for循环的要求是什么.(请不要让我使用数组或STL类型)

c++ iterator c++11

8
推荐指数
1
解决办法
2861
查看次数

iostream迭代器如何工作?

从标准模板库我开始了解istreamostream迭代器.我无法理解它们是如何工作的.

我也不明白他们为什么被使用.它们为什么有用?

c++ iterator iostream c++11

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

解决扩展特征的局限性

具有对象安全特性FooFooExt为所有实例实现的(可能不安全的)扩展特征的模式Foo现在似乎成为标准.

https://github.com/rust-lang/rfcs/pull/445

对于我来说这是一个问题Iterator<A>,因为我有一个库来覆盖IteratorExt#last()旧迭代器特征的默认方法(底层库有一个有效的实现last()).现在这是不可能的,因为对于任何人来说A,总会有一个冲突的特质实施IteratorExt,即libcore已经为所有人提供的实施Iterator<A>.

iterator.rs:301:1: 306:2 error: conflicting implementations for trait `core::iter::IteratorExt` [E0119]

iterator.rs:301 impl<'a, K: Key> iter::IteratorExt<Vec<u8>> for ValueIterator<'a,K,Vec<u8>> {
iterator.rs:302   fn last(&mut self) -> Option<Vec<u8>> {
iterator.rs:303      self.seek_last();
iterator.rs:304      Some(self.value())
iterator.rs:305   }
iterator.rs:306 }
...
Run Code Online (Sandbox Code Playgroud)

现在,据我所知,我有两个选择:

  • 有我自己的特点和我自己的last()实现.IteratorExt除非仔细使用,否则这意味着它会导致冲突.last()如果使用版本from,这也有意外使用低效版本的危险IteratorExt.我放松了方便的访问IteratorExt.
  • 拥有自己的特征并以不同方式命名方法(seek_last()).缺点:我要求用户学习词汇,并总是喜欢我的方法而不是提供的方法IteratorExt.同样的问题:我想避免意外使用last().

我还缺少其他更好的解决方案吗?

iterator traits rust

8
推荐指数
1
解决办法
400
查看次数

参考矢量的部分片段?

我有一个黑盒子C++函数,我无法访问其源代码:

void blackbox(vector<int> &input);
Run Code Online (Sandbox Code Playgroud)

此函数以未知方式修改输入向量的元素.

我现在的问题是我想仅对矢量的部分片段应用黑盒函数,例如,矢量的最后500个元素.所以,这是我为实现这一目标而编写的例程:

vector<int> foo (5,1000);
vector<int> bar (foo.end()-500,foo.end());

blackbox(bar);

swap_ranges(foo.end()-500,foo.end(),bar.begin());
Run Code Online (Sandbox Code Playgroud)

这段代码可能有用,但是有更好的方法吗?

如果我只能为现有矢量的一段定义矢量参考,而不是创建一个副本,那将是一件好事.我对上述代码中的复制和交换部分不太满意; 因为这个例程被频繁调用,我认为重复的复制和交换会减慢代码的速度.如果我知道块框完成的确切操作,我会重写函数,以便它将矢量迭代器作为输入参数.不幸的是,目前这是不可能的.

c++ iterator reference vector

8
推荐指数
1
解决办法
709
查看次数

返回RefCell中Vec的迭代器

鉴于以下structimpl:

use std::slice::Iter;
use std::cell::RefCell;

struct Foo {
    bar: RefCell<Vec<u32>>,
}

impl Foo {
    pub fn iter(&self) -> Iter<u32> {
        self.bar.borrow().iter()
    }
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

我收到有关终身问题的错误消息:

error: borrowed value does not live long enough
  --> src/main.rs:9:9
   |
9  |         self.bar.borrow().iter()
   |         ^^^^^^^^^^^^^^^^^ does not live long enough
10 |     }
   |     - temporary value only lives until here
   |
note: borrowed value must be valid for the anonymous lifetime #1 defined on the body at …
Run Code Online (Sandbox Code Playgroud)

iterator lifetime rust

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

Swift 3中最小的工作IteratorProtocol/Sequence

我发现在Swift 3中使用Sequence/IteratorProtocol找到"工作文档"非常困难.有些教程/文章似乎适用于较旧的Swift.

想象一下玩具双重链表名单DLList......

public class Node
    {
    // whatever "thing" you have a group of, this is that "thing"
    }
public class DLList
    {
    // toy linked list class here
    // so this is a group of "node" in this example
    }
Run Code Online (Sandbox Code Playgroud)

我相信以下代表了最简单(?),正确的方法,使其可以,一句话,用DLList在一个for结构.

第1步,让你的DLList符合DLList:Sequence

public class DLList:Sequence
    {
    // toy linked list class here

    public func makeIterator() -> DLListIterator
        {
        return DLListIterator(self)
        }
    }
Run Code Online (Sandbox Code Playgroud)

似乎你所要做的就是添加makeIterator呼叫.

第2步,编写你的迭代器,符合 IteratorProtocol

由于该类是DLList,我们将其称为DLListIterator.看起来似乎是这样

1,你必须有一个"init",基本上是有问题的组类

2,你必须有一个next电话,它必须返回一个与你的小组类神奇相关的"事物". …

iterator sequence swift3

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