草庐IT

c++ - 如何获取一个字符串在内存中实际占用的字节数?

据我所知,在C++中有依赖于实现的string优化,它让string不分配任何额外的堆内存来存储它的字符,而是将字符存储在string对象本身中。所以如果字符串s在堆上分配了额外的内存,它消耗的总内存是sizeof(string)+s.capacity(),但是,如果它不分配堆上的任何额外内存,即将其字符存储在string对象中,则总内存消耗为sizeof(string)。有没有办法计算出这个数量——字符串消耗的总内存?问题是我没有找到一种方法来确定字符串对象是否已在堆上分配内存,所以我不知道对某个string使用哪个公式。编辑:如果没有其他解决方案,黑客在STL命名空间中注入(inj

c++ - 将 initializer_list 插入 std::vector 时出现 "Invalid iterator range"

此代码在Ideone上按预期编译并运行良好:#include#include#includeintmain(){std::vectorstrVec;strVec.insert(strVec.end(),{L"black",L"white",L"red"});strVec.insert(strVec.end(),{L"blue",L"green"});//STLexceptionfor(auto&i:strVec){std::wcout但是,在MSVC(VisualStudio2013)中因“无效的迭代器范围”而失败。有什么见解吗?顺便说一句,插入更多元素是可行的,例如在第二个插入中,这

c++ - Nested loop of same vector - Erase–remove 成语

我想迭代vector的所有元素,并为每个元素检查vector的所有其他元素的条件。逻辑:Precondition:qisnotinvectorforeveryx,yinvectorifd(x,y)一种方法:for(vector::iteratorit=candidates.begin();it!=candidates.end();++it){for(vector::iteratorit2=candidates.begin();it2!=candidates.end();++it2){if(dist.transformed_distance(*it,*it2)我知道如果我在循环中删除一个

c++ - 使用自定义类的 C++ STL 映射的运算符重载

我对在C++中使用STLmap有疑问。我知道将map与自定义类一起使用我需要重载“#include#includeusingnamespacestd;structbox{inte,s,w;box():e(-1),s(-2),w(-3){}booloperatorhashtable;boxb;hashtable[b]=1;return0;}在这里,我非常简单地重载了booloperator还有其他方法。所以我的问题是,这样做,重载我在这里的唯一动机是存储成对的box和int(请参阅main函数),以便我可以在O(log(n))时间内访问它们。更新我认为有一个糟糕的比较器不会影响map的访

c++ - 如何在 C++1z 中使用实验性并行 STL?

我想尝试C++17的并行STL。但是,我在libc++中找不到experimental/execution_policy。我该如何尝试?我正在尝试http://en.cppreference.com/w/cpp/experimental/reduce,它说我应该包括这些文件,但我找不到execution_policy。#include安装libc++后(我按照http://libcxx.llvm.org/docs/BuildingLibcxx.html),我尝试了以下命令,但没有成功。$clang++-3.5-std=c++1ztest.cpp-lc++experimentaltest

c++ - 静态或堆栈分配数组的可变大小元素是否驻留在堆空间中?

以下内容可能与平台无关,但无论如何我都会在Win10GCC上修复它。假设您在main()的静态内存空间中创建一个数组或vector,其中每个元素的大小都可以是可变的:RADIAL_UNITS=1000000;staticvectornecklace[RADIAL_UNITS]={};//eachelementisavariable-sizedvector,whichcanconsistofanywherefrom1-50Pearlobjects或者在main()中在栈上分配(假设栈空间设置为至少允许1000000个内存地址):vectornecklace[RADIAL_UNITS]={

C++,读取二进制 ifstream 时的奇怪行为

对于我的第一个问题,我想谈谈在C++中读取二进制文件;我正在重新编码ID3标签库。我正在解析二进制文件的header,前10个字节如下:ID3=3bytes=constantidentifier0xXXXX=2bytes=version(MSB:majorversion,LSB:minor.eg:0x0301=v3.1)0xXX=1byte=someflags4*0xXX=4bytes=size下面是一段代码来处理:charid[4];uint16_tversion;uint8_tflags;uint32_tsize;std::ifstream_stream;_stream=std::

c++ - 为什么会出现运行时错误 : Vector erase iterator outside range

我遇到了以下代码的奇怪运行时错误:#include#includeusingstd::vector;structData{intid;};intmain(){vectormylist;Datam;m.id=10;mylist.push_back(m);mylist.erase(std::remove_if(mylist.begin(),mylist.end(),[](constData&m){returnm.id>100;}));return0;}错误说:Vectoreraseiteratoroutsiderange我不是在解决了类似Ref1的问题之后,Ref2但意识到问题的原因以及我

c++ - 在 STL 容器中使用模板类

如果我有一个模板类,我想用不同的数据类型实例化它:templateclassA{Tvalue;//...};而且我还想在标准模板库容器中使用此类的对象(例如vector)。根据我的理解,创建一个A的vector对象不会被编译器接受,因为A和A实际上是不同的类型,我不能把它们放在同一个vector中。我找到的解决方法是创建一个基类、一个派生模板类和一个基类指针vector。classABase{//...};templateclassADerived:publicABase{Tvalue;//...};std::vectormySuperVector;我开始尝试使用模板以获得更好的理解,

c++ - 不可复制的 STL 分配器

我想创建一个不可复制的分配器(在C++14中),它只分配一个std::vector可以使用的固定内存块。我想防止分配器(以及vector)被复制,以防止用户意外分配内存。分配器仅用于std::vector或std::string。所以我的分配器有一个这样的复制构造函数:static_allocator(conststatic_allocator&)=delete;调用时:std::vector>vvv(static_allocator(3));我得到以下编译错误:/usr/include/c++/5/bits/stl_vector.h:Ininstantiationof‘std::_V