标签: iterator

为什么从std :: vector中随机删除比std :: list更快?

为什么std :: vector的随机删除比std :: list更快?我正在做的是加快速度,将随机元素与最后一个交换,然后删除最后一个元素.我原以为列表会更快,因为随机删除就是为它构建的.

for(int i = 500; i < 600; i++){
    swap(vector1[i], vector1[vector1.size()-1]);
    vector1.pop_back();
}

for(int i = 0; i < 100; i++){
        list1.pop_front();
}
Run Code Online (Sandbox Code Playgroud)

结果(以秒为单位):
Vec swap delete:0.00000909461232367903
列表正常删除:0.00011785102105932310

c++ iterator vector arraylist std

-1
推荐指数
2
解决办法
2925
查看次数

C++ 中的 std::map 迭代器初始化为零

我需要用零值初始化一个 interator。我试过以下代码

#include <map>
std::map<int, int>::iterator foo() {
    std::map<int, int>::iterator ret;
    ret = std::map<int, int>::iterator(0);
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

它在 Linux 上被 gcc 和 intel C++ 编译器成功编译。此外,这在 Windows 上的 minGW 中编译得很好。-O2 提供的代码是

xorl eax, eax
ret
Run Code Online (Sandbox Code Playgroud)

问题是在 VisualStudio 下编译。错误是: error C2440: '' : cannot convert from 'int' to 'std::_Tree_iterator>>> 没有构造函数可以采用源类型,或者构造函数重载解析不明确。

您能否给我一个想法如何将迭代器的初始化设置为零或重新措辞?

谢谢

聚苯乙烯

主要思想是在“列表”的末尾获取 NULL

(it = a.begin(); it != a.end(); it = it->next)

基于来自不同地图对象的 map::iterators。

a::end() {
    return std::map<K, V>::iterator(0)
}
Run Code Online (Sandbox Code Playgroud)

c++ iterator

-1
推荐指数
1
解决办法
2510
查看次数

空迭代器结束函数?

据我了解,迭代器的结束函数应该返回 null。当我尝试返回 nullptr 时,程序崩溃了。有人可以解释 end 函数应该如何表现吗?

结尾()

LinkList::Iterator LinkList::end()
{
    return tail->next;
}
Run Code Online (Sandbox Code Playgroud)

更新

这是我的 LinkList 类。另外两个嵌套在其中。

班级

class LinkList
{
public:

class Node
{
public:
    Node()
    {
        next = prev = NULL;
    }
    Node(int num)
    {
        data = num; next = prev = NULL;
    }

    int data;
    Node *next;
    Node *prev;
};

class Iterator
{
public:
    Iterator(Node* ptr);
    Iterator operator ++();
    int operator *();
    bool operator ==(Iterator it);
    bool operator !=(Iterator it);
    Node *ptr;
};

public:
    LinkList();
    virtual ~LinkList(); …
Run Code Online (Sandbox Code Playgroud)

c++ iterator

-1
推荐指数
1
解决办法
431
查看次数

C++:为什么输出迭代器不支持比较操作?

我已经读过除输出迭代器之外的所有其他类别的迭代器至少支持==和!=运算符.

为什么输出迭代器不支持这个?

c++ iterator stl

-1
推荐指数
1
解决办法
97
查看次数

在 Rust 中是否有任何等效于 JavaScript 的 forEach?

如何改进此功能:

use std::{env, process::exit};

fn get_grid() -> [[u8; 9]; 9] {
    let mut grid: [[u8; 9]; 9] = Default::default();
    let mut args: Vec<String> = env::args().collect();
    if args.len() != 10 {
        eprintln!("This program need 9 strings of 9 numbers between 0 and 9");
        exit(1);
    }
    args.remove(0);
    let _: Vec<_> = args
        .iter()
        .enumerate()
        .map(|(i, arg)| {
            let _line: Vec<_> = arg
                .split(' ')
                .enumerate()
                .map(|(j, value)| match value.parse() {
                    Ok(x) => {
                        grid[i][j] = x;
                        x
                    }
                    Err(e) => {
                        eprintln!("Value …
Run Code Online (Sandbox Code Playgroud)

iterator loops rust

-1
推荐指数
1
解决办法
2538
查看次数

将非临时对象传递给 const 字符串引用仍然会打印垃圾

我试图自己为 my_vec 编写一个迭代器:

#define BEGIN true
#define END false
#include <vector>
#include <iostream>

template<typename Container>
class my_vec {
private:
    class iterator {
        const my_vec *this_vec;
        using iterator_type = typename std::vector<std::pair<int, const Container&>>::const_iterator;
        iterator_type itr;
    public:
        iterator(const my_vec &s, bool state) :
                this_vec(&s) {
            if (state == BEGIN) {
                itr = s.v.begin();
            } else { /*(state==END)*/
                itr = s.v.end();
            }
        }
        iterator& operator++() {
            itr++;
            return *this;
        }
        std::pair<int, const Container&> operator*() const {
            return std::make_pair(1, this_vec->dog);
        }
        bool operator!=(iterator other) …
Run Code Online (Sandbox Code Playgroud)

c++ iterator pass-by-reference copy-constructor c++11

-1
推荐指数
1
解决办法
74
查看次数

当我迭代它们时,为什么 Rust 中的迭代器看起来很慢?

我有一个大文件,我正在使用 mmap 读取它。我想在每一行上做一些操作,所以我在它上面调用了 split() ,它为每一行提供了一个迭代器:

let file = File::open("myfile").unwrap();
let mmap = unsafe { MmapOptions::new().map(&file).unwrap() };
//splitting by newline
let iter = mmap.split(|elem| elem == &b'\n');
Run Code Online (Sandbox Code Playgroud)

这工作正常并且没有给我任何问题 - 运行速度非常快。

但是,当我通过迭代器时,它会跳转,并且通过 for 循环所需的时间大约是读取和拆分时间的 4 倍。

此外,这不处理该行或在 for 循环内执行任何操作:

for elem in iter {
  //process the line
}
Run Code Online (Sandbox Code Playgroud)

由于性能是一个问题 - 我发现它设法非常快速地读取和拆分文件很奇怪,但是,当我通过迭代器时它变得非常慢。我错过了什么吗?我对 Rust 的了解也很有限,所以不确定我是否在做坏事。有什么东西可以帮助我优化它并加快访问速度?

此外,并行迭代器在我的情况下没有那么有用 - 它们添加的开销不值得。

整个文件:

use memmap::MmapOptions;
use std::fs::File;
use std::time::{Duration, Instant};

fn main() {

    let now = Instant::now();
    let file = File::open("myfile").unwrap();
    let mmap = unsafe { MmapOptions::new().map(&file).unwrap() }; …
Run Code Online (Sandbox Code Playgroud)

iterator mmap rust

-1
推荐指数
1
解决办法
677
查看次数

c++ 尝试查找 vector&lt;struct&gt;.begin()/.end() 时出错

所以在我的项目中有这件事困扰着我,它阻止我在将 struct 作为向量类型时找到 vector.begin() 和 vector.end() 。任何人都可以帮助我吗?

struct product
{
    string name = "";
    int qty = 0, code = 0, cat = 0;
    double price = 0.00;
}

(...)
vector <product> prod;
(...)
for(int i = 0; i != prod.end(); i++) //error here
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏

c++ iterator loops for-loop vector

-1
推荐指数
1
解决办法
68
查看次数

为什么 VC++ 中有“表达式:在开始之前无法递减双端队列迭代器”的运行时断言?

void foo (std::deque<Class>& dq)
{
  auto it = dq.begin();
  --it;  // <--- asserts in VC++
  ...
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是一个过于简化的版本,但类似的情况也发生在我的代码中。它在 Ubuntu/Linux 中运行良好,但在 Visual Studio 中断言和中止程序。

表达式:无法在开始之前递减双端队列迭代器

有关程序如何导致断言失败的信息,请参阅 VC++ ...

即使我们没有寻找或取消引用迭代器的值,为什么它会将其视为运行时错误?

c++ iterator deque visual-c++ language-lawyer

-1
推荐指数
1
解决办法
160
查看次数

为什么我的基于范围的 for 循环适用于某些数据类型,但不适用于其他数据类型?

我尝试了一些基于范围的 for 循环来了解这个概念,对于整数数组和向量,它工作得很好。但对于字符向量,我的编译器不会给出任何错误消息或所需的结果,只是一行红点。这是我的代码:

\n
#include <iostream>\n#include <vector>\nusing namespace std;\nint main(){\n    vector<char> myVector {\'a\', \'b\', \'c\', \'d\'};\n    myVector.push_back(\'e\');\n    for (auto i : myVector){\n        cout << myVector[i] << endl;\n    }\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

什么\xe2\x80\x99s错了?我找不到任何东西。当我用整数替换字符时,效果很好。

\n

c++ iterator char stdvector range-based-loop

-1
推荐指数
1
解决办法
89
查看次数