尝试理解 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) 假设您有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。尽管还有其他简单的方法可以做到这一点,但我很好奇如何使用这种特定方法来完成它。
我正在阅读 rustbook 并发现了以下代码:
fn main() {
"Hello, world!".split("#").next().expect("some message");
}
Run Code Online (Sandbox Code Playgroud)
我运行了它,但程序没有恐慌,尽管字符串中没有这样的符号,并且迭代器在调用 next() 时应该返回 None 。
之后,我查看了文档,由于某种原因,我没有找到按字符串中不存在的模式进行分割的示例。
请解释为什么在这种情况下不返回 None 。
我正在开发一个项目,我需要重复地将已知数量的元素从缓冲区收集到向量中,我当前的代码是:
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) 使用 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
我在这里缺少什么?
我试图从类方法返回 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) 我经常遇到这个问题。每次我将向量写入文件或将其转换为字符串时,我都想知道是否有更好的方法来执行此操作。我的(相当丑陋的)代码:
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”。
我想知道是否有更简单的方法可以做到这一点。
我有一个包含其父级的节点类,并希望在其上创建迭代器.这是我的尝试:
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)
但是当我尝试遍历实例时,它永远不会停止并返回相同的值,我做错了什么?
我使用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".
为什么它不起作用,它是如何在幕后工作的?
我已经编写了一个用于无向图的类和一个符号表来将字符串转换为数字,反之亦然但是这两个字符串方法不起作用,因为我得到了堆栈溢出错误.我实现了一个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)