草庐IT

EidosValue_Int_vector

全部标签

c++ - 如何将 2 位从一个 int 复制到另一个?

我有两个无符号整型数:a和b(b是一个无符号整型指针)。我想将a的第8位和第9位复制到b的第2位和第3位(所有索引都基于0)。我是这样做的:boolsecondBit=(a&(1提醒:b是一个无符号整型指针。有更好的方法吗? 最佳答案 清除*b的相关位,并将它们设置为你想要从a中得到的位:*b=(*b&~0xC)|((a&0x300)>>6);//Thisisthe'not'of00001100,inotherwords,11110011~0xC;//Thiszerosthebitsof*bthatyoudonotwant(bbei

c++ - 为什么我可以用 int > +32767 来操作?

我可以读到int范围(有符号)来自[−32767,+32767]但我可以说,例如inta=70000;intb=71000;intc=a+b;printf("%i",c);return0;输出为141000(正确)。调试器不应该告诉我吗“此操作超出范围”或类似内容?我想这一定是因为我忽略了C编程的基础知识,但我目前正在阅读的所有书籍都没有提到这个“问题”。编辑:2147483647好像是上限,谢谢。如果总和超过该数字,则结果为负,这是预期的,但如果它是减法,例如:2147483649-2147483647=2,结果仍然不错。我的意思是,为什么值2147483649正确地用于该减法目的(

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++ - 为什么 memcpy/memmove 在将 int 复制到字节缓冲区时反转数据?

所以,我的问题很简单:我需要用一些信息填充一个char/unsignedchar数组。中间的一些值取自short/int类型,这就是发生的情况:代码:intfoo=15;//0x0000000Funsignedcharbuffer[100]={0};..memcpy(&buffer[offset],&foo,sizeof(int));//eithermemmove...输出:...0F000000..所以现在我写了一个函数来反转这些字段,但我认为这不是一个明智的解决方案,因为它会影响执行时间、资源和开发时间。有更简单的方法吗?编辑:正如你们中的许多人所指出的,这种行为是由小端处理器产生

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++ - 如何从一个long long int中提取四个unsigned short int?

假设我有一个longlongint并想从它的位中提取出四个unsignedshortint。特定的顺序在这里并不重要。我通常知道我需要移位并截断到unsignedshortint的大小。但我想我可能在某个地方犯了一些奇怪的错误,所以我问。 最佳答案 #include#includeunionui64{uint64_tone;uint16_tfour[4];};intmain(){unionui64number={0x123456789abcdef0};printf("%x%x%x%x\n",number.four[0],number

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