草庐IT

vector_tostr

全部标签

c++ - vector<char> 优于字符串的好处?

这个问题与thisquestion相关,但并不完全相同。.使用std::vector有什么好处吗?而不是std::string保存任意二进制数据,除了与可读性相关的问题?即与字符串相比,使用vector执行哪些任务更容易/更高效/更好? 最佳答案 除了可读性(不应低估)之外,我还可以想到在std::vector上使用std::string时会出现一些小的性能/内存问题:一些现代std::string实现使用smallstringoptimization.如果存储的数据大于string的内部缓冲区,就会变成悲观化,降低复制、移动和sw

c++ - 删除 vector 和双端队列中项目的时间复杂度

我已经读过将项目添加到std::vector末尾的时间复杂度是摊销常数,并在std::deque的顶部和底部插入项目>是恒定的。由于这两个容器都有一个随机访问迭代器,因此访问任何索引处的元素都是恒定的。如果我有任何这些事实错误,请告诉我。我的问题是,如果访问std::vector或std::deque中的元素是恒定的,那么为什么是通过删除O(n)删除元素的时间复杂度。答案之一here这里指出通过删除删除元素是O(n)。我知道删除删除了起始迭代器和结束迭代器之间的元素,所以答案基本上意味着它的O(n)取决于两个迭代器之间的元素数量以及删除单个元素来自任何索引中的vector/双端队列都会

c++ - C++ 的线程安全 vector 类

有人知道用于c++的快速而肮脏的线程安全vector类吗?我正在对一些代码进行多线程处理,我相信我遇到的问题与vector的使用方式有关。我计划重写代码,但在我疯狂地重做代码之前,我想用线程安全vector对其进行测试以确保。我还想如果有这样的东西,它会比编写我自己的版本容易得多。 最佳答案 由于算法,这很困难。假设您包装了vector以便它的所有成员函数都使用互斥体进行序列化,就像Java同步方法一样。然后并发调用该vector上的std::remove仍然不安全,因为他们依赖于查看vector并根据他们看到的内容进行更改。因此,

c++ - 为什么 vector<> 和 list<> 容器中的 push_back 不返回对插入元素的引用?

我意识到我可以通过调用back()来获取iterator引用,但为什么不使用push_back()来返回它呢?是出于性能原因吗?还是由于异常安全(类似于为什么pop_back()不返回弹出值)?无论哪种情况,请解释一下。 最佳答案 各种insert函数返回一个迭代器的原因很简单:调用者不一定知道如何获取该元素的迭代器。map::insert和set::insert返回一个,否则调用者将不得不搜索元素。当您执行vector::push_back时,您知道插入的元素在哪里。它是--vector.end()。您不必搜索它;总是那个位置。你

c++ - std::vector::reserve 是否保证在这种情况下实现不会使迭代器无效?

这是一个旨在:a)接受一个整数vectorb)对于输入vector中的每个int,附加这个int的倒数前提条件:无后置条件:返回vector的size()正好是2*输入vector的大小。请注意,vector是就地修改的。问题:这个函数在转换期间是否严格定义了针对迭代器失效的行为?奖金:有没有更好/更简洁/健壮的写法?代码:std::vectorappend_negatives(std::vectorv){v.reserve(v.size()*2);std::transform(begin(v),end(v),back_inserter(v),[](auto&&x){return-x;

c++ - 为什么析取赋值运算符 |= 不适用于 bool vector ?

如果我有vectorvec_bool那么我无法使用|=修改vector的内容赋值运算符。也就是线条vec_bool[0]|=true;vec_bool[0]|=vec_bool[1];给出编译错误,而行boola=false;a|=true;a|=vec_bool[0];vec_bool[0]=vec_bool[0]|vec_bool[1];vec_bool[0]=vec_bool[0]||vec_bool[1];vectorvec_int(3);vec_int[0]|=vec_int[1];不要。这是什么原因?(由gcc)给出的错误是:test.cpp:21:17:error:nom

c++ - 如何安全地将 std::vector 的内容复制到 c 样式的静态数组?

我需要在涉及中间插入的固定数组中操作数据。而不是使用memcpy等。我想使用vector。我想要的时候有问题将vector元素复制回c样式数组。代码如下:voidtryvector(){usingnamespacestd;constintMAX_SIZE=16;BYTEmyarr[MAX_SIZE]={0xb0,0x45,0x47,0xba,0x11,0x12,0x4e};vectormyvec(myarr,myarr+MAX_SIZE);vector::iteratorit;printf("myarrpre:");for(inti=0;i(*it)(*it)我正在使用vs2005。这

c++ - 为什么枚举不能用作此 vector 构造函数中的参数?

这段代码片段:enum{N=10,M=100};vectorv(N,M);由于以下错误,无法使用VisualStudio2013进行编译:errorC2838:'iterator_category':illegalqualifiednameinmemberdeclaration这有什么问题? 最佳答案 这是VS2012和VS2013中的一个错误,因为它不符合C++11标准(_HAS_CPP0X定义为1):C++0323.1.1[lib.sequence.reqmts]/9说:Foreverysequencedefinedinthis

C++11 可变参数模板 : return tuple from variable list of vectors

我想写一些类似于pythonzip(http://docs.python.org/2/library/functions.html)的东西。zip应该接受可变数量的不同类型的vector,并返回一个vector元组,截断到最短输入的长度。例如x=[1,2,3]v=['a','b']我希望输出是一个vector[,]如何在C++11中做到这一点? 最佳答案 急切地做到这一点并且只通过复制非常容易:#include#include#includetemplatestd::vector>zip(std::vectorconst&...vs

c++ - std::next 是 vector O(n) 还是 O(1)?

在C++11中我使用std::next因为如果我想将vector更改为list,我不必更改其余代码。对于list,std::next是O(n),因为我需要迭代所有元素。但是对于vector来说是怎样的呢?我找到了thisnoteoncppreference:However,ifInputItorForwardItadditionallymeetstherequirementsofLegacyRandomAccessIterator,complexityisconstant.vector是否满足这些要求?为什么是“遗产”? 最佳答案