草庐IT

vector_double

全部标签

c++ - Unique_ptr 的 STL vector - 如何重置?

我创建了两个标准的unique_ptrvector:std::vector>students;std::vector>teachers;然后,我创建一个新对象并将其放入vector中:students.push_back(std::unique_ptr(newStudent()));teachers.push_back(std::unique_ptr(newTeacher()));完成所有操作后,如何删除vector?Whitoutunique_ptr我不得不做一个循环并删除每个对象:while(!students.empty()){deletestudents.back();stud

c++ - C++ 中的 vector 和多态性

我有一个棘手的情况。它的简化形式是这样的classInstruction{public:virtualvoidexecute(){}};classAdd:publicInstruction{private:inta;intb;intc;public:Add(intx,inty,intz){a=x;b=y;c=z;}voidexecute(){a=b+c;}};然后在一节课上我做了类似...voidsome_method(){vectorv;Instruction*i=newAdd(1,2,3)v.push_back(*i);}在另一个类(class)...voidsome_other_

c++ - 32位机器如何计算 double

如果我只有32位机器,cpu如何计算double?这个数字是64位宽。FPU如何处理它?更一般的问题是,如何计算比我的alu更宽的东西。但是我完全理解整数方式。你可以简单地split他们起来。然而对于float,你有指数和尾数,应该以不同的方式处理。 最佳答案 并非“32位机器”中的所有内容都必须是32位的。x87风格的FPU从一开始就不是“32位”的,那是在AMD64出现之前的很长时间。它始终能够在80位扩展double上进行数学运算,并且它曾经是一个单独的芯片,因此根本没有机会使用主ALU。是的,它比ALU宽,但它不通过ALU,

c++ - 使用 std::begin 和 std::end 进行 vector 初始化

为什么可行?有两个不同的字符串"testString"但vector大小分配正确。#include#include#includeintmain(){std::vectorstr;str.assign(std::begin("testString"),std::end("testString"));copy(str.begin(),str.end(),std::ostream_iterator(std::cout,""));std::cout 最佳答案 你很幸运,编译器执行了stringpooling优化。请注意,您所做的仍然是未定

c++ - std::vector 中的每个元素访问都是缓存未命中吗?

众所周知,std::vector将其数据保存在堆上,因此vector本身的实例和第一个元素具有不同的地址。另一方面,std::array是原始数组的轻量级包装器,其地址等于第一个元素的地址。让我们假设集合的大小足以容纳int32的一个缓存行。在我有384kBL1缓存的机器上它是98304个数字。如果我迭代std::vector,我总是首先访问vector本身的地址,然后访问下一个元素的地址。并且可能这个地址不在同一个缓存行中。所以每次元素访问都是缓存未命中。但如果我迭代std::array地址在同一个缓存行中,那么它应该更快。我用VS2013进行了全面优化测试,std::array快了

c++ - 为什么在向类内的数据 vector 插入元素时出现段错误?

我在vector中插入数据时收到段错误。我认为vector没有分配。我不想保留大小。怎么做?classA{private:structdata{intx;inty;};std::vectorSet;public:voidinsert(){Set[0].x=5;Set[0].y=6;}};Aa;a.insert();//SegmentationFault 最佳答案 使用std::vector::push_back().访问第一个元素(Set[0])是未定义的行为。默认构建的vector是空的。

c++ - Float 或 Double 特殊值

我有double(或浮点)变量,它们可能是“空的”,因为没有有效值。我如何使用内置类型float和double表示这种情况?一个选项是包含一个float和一个bool值的包装器,但这行不通,因为我的库有存储double值的容器,而不是表现为double值的对象。另一个是使用NaN(std::numeric_limits)。但我看不出有什么办法可以检查变量是否为NaN。如何解决需要“特殊”浮点值来表示数字以外的其他含义的问题? 最佳答案 我们已经通过使用NaN做到了这一点:doubled=std::numeric_limits::si

c++ - 何时为键值数据选择 std::vector 而不是 std::map?

考虑到在主内存中搜索时缓存和数据局部性的积极影响,我倾向于使用std::vector与std::pair-喜欢键值项并对两者执行线性搜索,如果我知道键值项的总量永远不会“太大”而不会严重影响性能。最近我遇到了很多情况,我事先知道我将有大量键值项,因此选择了std::map从头开始。我想知道在上述情况下,您是如何决定使用合适的容器的。你会吗总是使用std::vector(或类似)?总是使用std::map(或类似)?对项目计数范围内的哪一个比另一个更可取有直觉吗?完全不同的东西?谢谢! 最佳答案 我很少将std::vector与线性搜

c++ - 原子地 std::vector::push_back() 并返回索引

我需要创建一个函数,将一个值附加到vector并返回刚刚附加的值的索引。例子:intappend(std::vector&numbers,intnumber){intretval=numbers.size();//whatifsomeotherthreadcallspush_back(number)inbetweenthesecalls?numbers.push_back(number);returnretval;}我想以原子方式执行此操作,以便返回的索引始终正确,即使可能有多个线程将值附加到vector。如果push_back返回刚刚添加的项目的索引,那会很容易。如何保证返回正确的索

c++ - 关于填充 vector 的不同方法

我可以想到三种填充std::vector的方法假设我们有vectorv(100,0);然后我希望它保持(1,1,1)。我们可以做到:v.clear();v.resize(3,1);或者v=vector(3,1);而且我学会了另一种方法:vector(3,1).swap(v);第一个问题是:它们中的任何一个是最好的方法吗?第二个问题:假设v是在main函数之外声明的。根据这个answer,内存将分配在数据段。如果我使用第二种或第三种方法,内存会分配在堆栈上吗? 最佳答案 你如何使用vector的成员来完成这项任务?std::vecto