草庐IT

string-comparison-functions

全部标签

c++ - C++17 std::basic_string_view 是否会使 C 字符串的使用无效?

C++17正在引入std::basic_string_view,它是非拥有字符串版本,其类仅存储指向字符串第一个元素的指针和字符串的大小。还有理由继续使用C字符串吗? 最佳答案 IstherestillareasontokeepusingCstrings?我认为可以公平地说,除了使用CAPI之外,从来没有有理由使用C字符串。在设计只需要字符的只读表示的函数或方法的接口(interface)时,您会更喜欢std::string_view。例如。搜索字符串、生成大写拷贝、打印它等等。在设计一个接受字符串拷贝的接口(interface)时

c++ - 比较 std::tr1::function<> 对象

我一直在尝试使用用于存储处理事件的函数的tr1函数模板在C++中实现类似C#的事件系统。我创建了一个vector,以便可以将多个监听器附加到此事件,即:vector>listenerList;我希望能够从列表中删除处理程序以停止监听器接收事件。那么,我如何才能在此列表中找到对应于给定监听器的条目?我可以测试列表中的“函数”对象是否引用特定函数吗?谢谢!编辑:在研究了boost::signal方法之后,它似乎可能像你们中的一些人所建议的那样使用token系统来实现。Here'ssomeinfoonthis.观察者在附加到事件时会保留一个“Connection”对象,并且此连接对象用于在需

c++ - 这是对临时 std::string 的正确使用吗?

std::stringgetMyString(){return;}...HANDLEsomething=OpenSomething(getMyString().c_str(),...);我读过GuaranteedlifetimeoftemporaryinC++并且我相信临时字符串将一直存在到分配被评估之前,即足够长的时间来使这项工作按预期进行。之前遇到过一次与std::string生命周期相关的错误(不记得是什么)我宁愿仔细检查...... 最佳答案 临时函数的析构函数直到函数调用返回后才会被调用,所以我们在这里看到的是安全的。但是

c++ - std::string 内存管理

我在使用std::string进行内存管理时遇到问题。我有应用程序-带有分离线程的多线程服务器(我确实需要加入它们,它们会完成工作并退出),我发现一段时间后内存使用率很高。我已经开始试验问题出在哪里,我已经创建了演示问题的测试程序#include#include#includepthread_tthread[100];usingnamespacestd;classtst{public:tst(){//coutcalc();deleteTEST;pthread_exit((void*)0);}intmain(intargc,char*constargv[]){cout第一个“---”之后

c++ - 我很困惑! C++ 中的 Char、Char* 或 String

当我使用char或char*时,visualstudio2012(11)只计算最后一个字符,例如:#include#includeintmain(){usingnamespacestd;charchName='Alex';cout它只显示“x”。我用的是正确的字符串strName="Alex"但是在那些参数为字符的函数中,字符串不能作为参数传递。在这种情况下,VS编译器说字符串不能转换为int。还告诉我char和char*之间有什么区别。我是一名PHP开发人员,而C++是如此令人困惑。请帮助我。 最佳答案 char一次只能保留1个字

c++ - `const std::string& s = nullptr` 作为可选参数如何工作

据我所知,引用不能为空,但是当我运行这样的代码时:#include#includevoidtest(inti,conststd::string&s=nullptr){std::cout可选参数s可以为null,构建代码。更重要的是,当test(2)运行时,程序会抛出异常,而不是打印一些随机字符串。当我将s更改为一些基本类型(如int)时,它无法编译,所以我认为魔法留在字符串类中,但如何呢?而且,我如何检查s是否为空?如果我使用if(s==nullptr)或if(s.empty()),它无法编译。 最佳答案 test使用构造函数初始化

用std :: vector&lt; std :: string&gt填充虚拟listView;

我有成千上万个字符串的向量:std::vectora;充满了一些算法。遵循描述的方法这里,这是我创建一个ListView作为“虚拟列表”:hList=CreateWindowEx(0,WC_LISTVIEW,L"",WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_OWNERDATA,0,0,800,400,hWnd,(HMENU)ID_LISTVIEW,hInst,NULL);LV_COLUMNlvcol;...ListView_InsertColumn(hList,0,&lvcol);ListView_SetItemCountEx(hList,100000,LVSICF

c++ - string::npos 如何知道我指的是哪个字符串?

我正在阅读一本关于C++的书,它只是介绍了如何使用string::npos检查字符串中是否存在字符位置。不过,我不明白这种机制怎么可能知道我指的是哪个字符串!此特定代码正在计算子字符串的出现次数。代码:for(inti=cats.find("cat",0);i!=string::npos;i=cats.find("cat",i)){++catCount;++i;}我知道它在单词第一次出现时开始循环,每次通过都会递增计数器以避免对同一个子字符串计数两次,然后在每次循环结束时计数器跳转到子字符串的下一次出现。当计数器不作为字符串的字符索引存在时,循环停止。虽然这个字符串叫做cats,但在“

c++ - 复制一个 std::function 有多昂贵?

虽然std::function是可移动的,但在某些情况下这是不可能的或不方便的。复制它会受到严重处罚吗?它是否可能取决于捕获变量的大小(如果它是使用lambda表达式创建的)?是否依赖于实现? 最佳答案 std::function通常实现为值语义、小缓冲区优化、虚拟调度、类型删除类。这意味着如果您的状态很小,则复制将不涉及堆分配(除了在状态的复制构造函数内)和一些间接(找到如何复制此特定状态)。如果您的状态很大(例如,在当前MSVC上大于两个std::string),则需要额外的堆分配来存储状态。这不是您想要在每帧每个像素的基础上执

c++ - 为什么我不能将 boost::function 存储在 std::list 中?

我得到以下编译错误:error:expected`;'before'it'"这是我的代码:#include#includetemplatevoidexample(){std::list>::iteratorit;}为什么会这样?我该如何解决? 最佳答案 您需要将typename放在该行的前面,因为您执行::iterator的类型取决于模板参数T。像这样:templatevoidexample(){typenamestd::list>::iteratorit;}考虑这条线std::list>::iterator*it;这可能意味着乘法