标签: iterator

C++ 中的迭代器。如何在知道迭代器的情况下修改向量?

尝试理解 C++ 中的迭代器。例如,在下面的代码中我们打印一个向量。

using Iterator = vector<int>::iterator;

void PrintRange(Iterator range_begin, Iterator range_end) {
    for (auto it = range_begin; it != range_end; ++it) {
        cout << *it << " ";
    }
}

int main() {
    vector<int> numbers = {5, 3, 2, 1};
    PrintRange(begin(numbers), end(numbers));
    return 0;
}
// 5 3 2 1 
Run Code Online (Sandbox Code Playgroud)

我的问题是如何正确编写一个仅需要两个迭代器并修改向量的函数。例如,函数 my_sort 对向量进行排序,如果我们写

my_sort(begin(numbers), end(numbers));
Run Code Online (Sandbox Code Playgroud)

number 包含修改后的排序向量。

void my_sort(Iterator range_begin, Iterator range_end) {
    // how to modify a vector knowing its iterators ?
}
Run Code Online (Sandbox Code Playgroud)

c++ iterator

0
推荐指数
1
解决办法
119
查看次数

如何通过数组的多个索引执行 &gt;&gt; std::skipws &gt;&gt; ?

假设您有std::array<int, SIZE> a,并且您已将 的每个元素保存a到一个文件中,在一行中用空格分隔。然后你想用via读取它们std:istream& is

is >> std::skipws >> a[0] >> a[1] >> a[2] >> ... >> a[SIZE-1];
Run Code Online (Sandbox Code Playgroud)

对于 的任何值,如何通用地编写此代码SIZE。尽管还有其他简单的方法可以做到这一点,但我很好奇如何使用这种特定方法来完成它。

c++ iterator fstream istream

0
推荐指数
1
解决办法
48
查看次数

意外的字符串分割行为

我正在阅读 rustbook 并发现了以下代码:

fn main() {
    "Hello, world!".split("#").next().expect("some message");
}
Run Code Online (Sandbox Code Playgroud)

我运行了它,但程序没有恐慌,尽管字符串中没有这样的符号,并且迭代器在调用 next() 时应该返回 None 。

之后,我查看了文档,由于某种原因,我没有找到按字符串中不存在的模式进行分割的示例。

请解释为什么在这种情况下不返回 None 。

string iterator split rust

0
推荐指数
1
解决办法
159
查看次数

收集元素时设置向量的容量

我正在开发一个项目,我需要重复地将已知数量的元素从缓冲区收集到向量中,我当前的代码是:

let mut info: Vec<i32> = buffer.trim().split(" ").collect()
Run Code Online (Sandbox Code Playgroud)

然而,据我所知,我将收到 2 个元素,我希望能够设置向量的容量,例如:

let mut info: Vec<i32>::with_capacity(2) = buffer.trim().split(" ").collect()
Run Code Online (Sandbox Code Playgroud)

iterator collect rust

0
推荐指数
1
解决办法
278
查看次数

Scala 迭代器在 size 之后调用下一个不会引发错误

使用 Scala 2.13.10 的本地解释器我运行以下代码

scala> val it = Iterator("a", "number", "of", "words")
val it: Iterator[String] = <iterator>
scala> it.size
val res0: Int = 4
scala> it.next()
val res14: String = a
Run Code Online (Sandbox Code Playgroud)

我假设运行命令 it.size 将遍历迭代器,并且 it.next() 将失败,正如 Scala 文档中所述

it.size 它返回的元素数量。注意:此操作结束!

https://docs.scala-lang.org/overviews/collections-2.13/iterators.html

我在这里缺少什么?

iterator scala

0
推荐指数
1
解决办法
57
查看次数

C++ 从类方法返回 const 反向迭代器,但方法不能是 const?

我试图从类方法返回 const 反向迭代器。但是当我将方法标记为 时,我的代码无法编译const。没有const代码编译就没有问题。

知道为什么吗?

#include <iostream>
#include <vector>

template <class ValueType>
class DynamicDataComponent {
    using ValuesType = std::vector<ValueType>;
    using IteratorType = typename std::vector<ValueType>::reverse_iterator;

public:
    DynamicDataComponent()
    {
        values.push_back(0);
        values.push_back(1);
        values.push_back(2);
        values.push_back(3);
    }

    const IteratorType getRBeginIt() const {
        return values.rbegin();
    }

private:
    ValuesType values;
};

int main() {
    DynamicDataComponent<size_t> dataComponent;
    std::cout << *dataComponent.getRBeginIt() << "\n";
}
Run Code Online (Sandbox Code Playgroud)

c++ methods iterator constants const-iterator

0
推荐指数
1
解决办法
115
查看次数

rust 将向量写入文件(或字符串)的惯用方式是什么?元素之间有制表符,末尾有换行符?

我经常遇到这个问题。每次我将向量写入文件或将其转换为字符串时,我都想知道是否有更好的方法来执行此操作。我的(相当丑陋的)代码:

fn main() {
    let vec = vec![1, 2, 3, 4, 5];

    let as_string = vec
        .iter()
        .take(vec.len() - 1)
        .fold("".to_string(), |acc, elem| {
            acc + &format!("{}\t", elem)
        })
        + &format!("{}\n", vec.last().unwrap());
    
    print!("{}", as_string);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我想迭代除最后一个元素之外的所有元素,并在每个向量元素后面附加一个“\t”,除非它是最后一个元素。在本例中,我想在元素后面附加一个“\n”。

我想知道是否有更简单的方法可以做到这一点。

iterator rust

0
推荐指数
1
解决办法
110
查看次数

Python类迭代器

我有一个包含其父级的节点类,并希望在其上创建迭代器.这是我的尝试:

class Node:
    def __init__(self, parent=None):
        self._parent = parent

    def __iter__(self):
        self = self.parent

    def __next__(self):
        if self.parent is None:
            raise StopIteration
        else:
            self = self.parent
            return self
Run Code Online (Sandbox Code Playgroud)

但是当我尝试遍历实例时,它永远不会停止并返回相同的值,我做错了什么?

python iterator

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

以前在Java的List Iterator中

我使用Java的列表迭代器,我不明白以前的方法是如何工作的.我得到链接列表"B"的下一个元素,然后我尝试获取前一个元素"A",但我得到"B".

LinkedList<Character> abc = new LinkedList<Character>();
abc.add('A');
abc.add('B');
ListIterator<Character> iterator = abc.listIterator();
System.out.println(iterator.next());
System.out.println(iterator.next());
System.out.println(iterator.previous());
Run Code Online (Sandbox Code Playgroud)

输出为"A","B","B".

为什么它不起作用,它是如何在幕后工作的?

java iterator

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

如何在java中为加权无向图编写toString方法?

我已经编写了一个用于无向图的类和一个符号表来将字符串转换为数字,反之亦然但是这两个字符串方法不起作用,因为我得到了堆栈溢出错误.我实现了一个LinkedStack,它与java库中的堆栈相同.我没有收到编译错误,如果能查看toString方法,我将不胜感激.其他方法工作正常.这是下面的代码.我认为问题是当我调用迭代器时

public class EdgeWeightedGraph {
private final int V;
private int E;
private LinkedStack<Edge>[] adj;

public EdgeWeightedGraph(int V){
    this.V = V;
    this.E = 0;
    adj = new LinkedStack[V];
    for (int v = 0; v < V; v++)
    {
        adj[v] = new LinkedStack<Edge>();
    }
}

public int V(){
    return V(); // This was the error. thank you for spotting it :)
}

public int E(){
    return E;
}

public int degree(int v){
    return adj[v].size();
}

public void addEdge(Edge e){
    int v …
Run Code Online (Sandbox Code Playgroud)

java iterator tostring undirected-graph weighted-graph

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