为什么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
我需要用零值初始化一个 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) 据我了解,迭代器的结束函数应该返回 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) 我已经读过除输出迭代器之外的所有其他类别的迭代器至少支持==和!=运算符.
为什么输出迭代器不支持这个?
如何改进此功能:
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) 我试图自己为 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) 我有一个大文件,我正在使用 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) 所以在我的项目中有这件事困扰着我,它阻止我在将 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)
任何帮助表示赞赏
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++ ...
即使我们没有寻找或取消引用迭代器的值,为什么它会将其视为运行时错误?
我尝试了一些基于范围的 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}\nRun Code Online (Sandbox Code Playgroud)\n什么\xe2\x80\x99s错了?我找不到任何东西。当我用整数替换字符时,效果很好。
\n