草庐IT

c++ - vector push_back 调用 copy_constructor 不止一次?

我对vectorpush_back的行为方式有点困惑,在下面的代码片段中,我希望复制构造函数只被调用两次,但输出表明并非如此。是否是导致此行为的vector内部重组。输出:InsidedefaultInsidecopywithmy_int=0Insidecopywithmy_int=0Insidecopywithmy_int=1classMyint{private:intmy_int;public:Myint():my_int(0){coutmyints;Myintx;myints.push_back(x);x.set(1);myints.push_back(x);

C++:是否有任何理由使用 uint64_t 而不是 size_t

我对size_t的理解是它足够大以容纳您可能期望它需要容纳的任何(整数)值。(也许这是一个糟糕的解释?)例如,如果您使用for循环之类的东西来遍历vector中的所有元素,size_t通常为64位长(或至少在我的系统上),以便它可以保存vector.size()的所有可能返回值。或者至少,我认为这是正确的?因此,是否有任何理由使用A而不是B:答:for(uint64_ti=0;i乙:for(size_ti=0;i如果我的解释有误或者您有更好的解释,请随时修改。编辑:我应该补充一点,我的理解是size_t表现得像一个普通的无符号整数-也许这是不正确的? 最佳答

C++ 如何断言 vector 中的所有 std::shared_ptr 都引用了某物

当我有一个函数接收一个应该引用某物的(智能)指针时,我总是这样开始:classFoo;voiddoSomething(conststd::shared_ptr&pFoo){assert(pFoo);//...}现在我正在为(智能)指针的vector(或其他容器)寻找类似的断言条件。我能想到的最好的办法是:voiddoSomething(conststd::vector>&pFoos){assert(std::all_of(pFoos.begin(),pFoos.end(),[](conststd::shared_ptr&pFoo){returnpFoo;}));//...}我想知道这是

c++ - 对字符串使用 set_union

我有两个vector,我需要在第三个vector中合并它们(不指定第三个vector的大小)std::vectora={"a","b"};std::vectorb={"d","c"};std::vectorc;std::set_union(a.begin(),a.end(),b.begin(),b.end(),c.begin());std::cout这会编译但给出一个空输出。 最佳答案 算法std::set_union需要有序序列。在您的字符串示例中,第一个vector按升序排列,第二个vector按降序排列。此外,vectorc为

c++ - 为什么我的字符串的开头消失了?

在下面的C++代码中,我意识到gcount()返回的数字比我想要的要大,因为getline()消耗了最后一个换行符但没有t将其发送到输入流。不过,我仍然不明白程序的输出。对于输入“Test\n”,为什么我得到“est\n”?为什么我的错误会影响字符串的first字符,而不是在末尾添加不需要的垃圾?为什么程序的输出与字符串在调试器中的显示方式不一致(如我所料,“Test\n”)?#include#include#include#includeusingnamespacestd;intmain(){constintbufferSize=1024;ifstreaminput("test.tx

C++ 堆栈分配对象,显式析构函数调用

我在处理现有库时遇到了析构函数的奇怪用法。堆栈分配的STLvector的析构函数被显式调用,在这种情况下可能需要再次使用该对象。这些vector对象是STLvector类的稍微定制的版本,具有专门的clear方法。在析构函数体中存在两个方法调用:clear()、_Tidy()。我一直在努力寻找调用此析构函数的充分理由,而不仅仅是clear但我不知所措。谁能阐明为什么这可能是个好主意? 最佳答案 clear()不能保证实际释放vector中分​​配的存储;MSVC实现中的_Tidy()实际上会释放该存储空间,因此这可能是作为优化完成的

c++ - 为什么字符串和 vector 是不同的类型?

它们都是可调整大小的数组,并且std::basic_string没有任何与upper()类似的特定字符相关函数。字符串有什么特别之处使其更适合字符数据? 最佳答案 大部分原因与本地化和国际化(L10I18)、性能以及历史原因有关。对于L10I18问题,添加了char_traits,您会注意到流也有这些。目的是在某种程度上制作“更聪明的角色”,但结果毫无用处。关于char_traits的唯一好处是将一些std::string/wstring比较、复制等专门化为编译器内在函数。失败主要是由于UNIX流本身,它将字符视为主要“原子”,而在

c++ - T::iterator 出错,其中模板参数 T 可能是 vector<int> 或 list<int>

我正在尝试编写一个函数来打印常见STL容器(vector、列表等)的表示。我给了函数一个模板参数T,例如,它可能代表vector。我在获取T类型的迭代器时遇到问题。vectorv(10,0);repr>(v);...templatevoidrepr(constT&v){cout...brett@brett-laptop:~/Desktop/stl$g++-Wallmain.cppmain.cpp:Infunction‘voidrepr(constT&)’:main.cpp:13:error:expected‘;’before‘i’main.cpp:14:error:‘i’wasnotd

C++ 从函数返回更精确的两个模板参数?

我很好奇是否有任何方法可以在C++中执行此操作。假设我有一个模板化vector类:templateclassvector{public:vector(Ta,Tb,Tc):x(a),y(b),z(c){}Tx,y,z;};然后我有一个模板化的加法运算符:templatevectoroperator+(constvector&a,constvector&b){returnvector(a.x+b.x,a.y+b.y,a.z+b.z);}我很好奇是否可以修改该运算符,使结果是A和B两种类型中更精确的一种,除了手动对其进行特化之外。例如:vector+vectorwouldproduceave

c++ - std::string 或 std::vector<char> 保存原始数据

我希望这个问题适用于stackoverflow...将原始数据字节(8位)存储在std::string中有什么区别?而不是将它们存储在std::vector中.我正在从文件中读取二进制数据并将这些原始字节存储在std::string中.这很好用,这样做没有问题。我的程序按预期工作。但是,其他程序员更喜欢std::vector方法并建议我停止使用std::string因为它对原始字节不安全。所以我想知道为什么使用std::string可能不安全保存原始数据字节?我知道std::string最常用于存储ASCII文本,但是一个字节就是一个字节,所以我不明白std::vector的偏好.感谢