避免使用临时的std::string来调用boost::unordered_map::find
我有以下类型: boost::unordered_map objectContainer; 使用std::strings作为密钥,它只是某些域对象的映射.现在,std::string可以与const char*进行比较. (尽管可能正在发生隐式转换,但不需要明确的std::string临时?) 当我尝试做 之类的事情时,问题就会发生 void findStuff(const char* key) { auto it = objectContainer.find(key); //
18 2024-04-02
编程技术问答社区
如何将C++字符串中的一个词大写?
我有一个std :: string,并希望第一个字母大写,其余的较低案件. 我可以做到的一种方法是: const std::string example("eXamPLe"); std::string capitalized = boost::to_lower_copy(example); capitalized[0] = toupper(capitalized[0]); 将产生capitalized as: "示例" ,但也许有更直接的方法可以做到这一点? 解决方案 如果字符串确实只是一个单词,std::string capitalized = boost::locale::to_title (example)应该这样做.否则,您拥有的是非常紧凑的. 编辑:刚刚注意到boost::python名称空间具有带有capitalize()方法的str类,听起来它可以适用于多单词字符串(假设您想要所描述的内容,而不是标题案例).但是,使用python
6 2024-04-02
编程技术问答社区
如何将std::string放入boost::lockfree::queue(或替代方案)?
我正在尝试将std::string s放入boost::lockfree::queue s,以便我的线程可以通过新数据相互更新. 当我尝试使用boost::lockfree::queue updated_data;时,g++说: 'class boost :: lockfree :: queue>': 的实例化. 错误:静态断言失败:( boost :: has_trivial_destructor :: value) 错误:静态断言失败:( boost :: has_trivial_assign :: value) 我曾经一般显示了什么这些错误的意思是,但是我没有希望自己修复此问题,因为我几乎是C ++的新手. 是否有另一种方法可以在lockfree的线程之间传递文本数据?如果没有,请告诉我如何将std::string放入boost::lockfree::queue. 解决方案 如果将原始指针放在队列中,则旧的std:
56 2024-04-02
编程技术问答社区
在C++中使用s后缀的任何优势
我的问题与C ++中的" S"后缀有关? 使用" S"后缀的代码示例: auto hello = "Hello!"s; // a std::string 同样的写作可以写为: auto hello = std::string{"Hello!"}; 我能够在线找到" S"后缀来最大程度地减少错误并阐明我们在代码中的意图. 因此,是否仅适用于代码的读取器" S"后缀?还是其他使用的优势? 解决方案 null字符可以琐碎地包含在原始字符串中;示例来自 http://en.cppreference.com/w/cpp/string/basic_string/operator%22%22S int main() { using namespace std::string_literals; std::string s1 = "abc\0\0def"; std::string s2 = "abc\0\0def"s; st
24 2024-03-20
编程技术问答社区
std::atomic<std::string>是否适当地工作?
我正在通过安东尼·威廉姆斯(Anthony Williams)的" C ++并发性"和第5章中阅读,其中谈到了新的多线程感知记忆模型和原子操作,他说: 为了将std::atomic用于某些用户定义的UDT,此类型必须具有A Trivial 复制分配运算符. 据我了解,这意味着我们可以使用std::atomic如果以下返回true: std::is_trivially_copyable::value 通过这种逻辑,我们不应该将std::string用作std::atomic的模板参数,并且它可以正常工作. 但是,以下代码编译并以预期输出运行: #include #include #include #include int main() { std::atomic atomicString; atomicSt
12 2024-03-18
编程技术问答社区
明确的复制构造函数
我已经扩展了std ::字符串,以满足我必须将自定义函数构建为 CustomString 的字符串类构建的需求 我已经定义了构造函数: class CustomString : public std::string { public: explicit CustomString(void); explicit CustomString(const std::string& str); explicit CustomString(const CustomString& customString); //assignment operator CustomString& operator=(const CustomString& customString); ... }; 在第三个构造函数(复制构造函数)和分配运算符中,其定义为: CustomString::Custo
14 2024-03-17
编程技术问答社区
将char数组传递给期望const std :: string参考的函数
我在插座界面中写了一个错误,我在一段时间之前写了,我只是在查看代码是否有其他问题时注意到了问题.插座接收一串字符,并将其传递给JSONCPP以完成JSON解析.我可以几乎 明白这里发生了什么,但我不能绕过它.我想掌握引擎盖下实际发生的事情.这是最小示例: #include #include void doSomethingWithAString(const std::string &val) { std::cout
14 2024-03-06
编程技术问答社区
c++中的char* vs std::string
我什么时候应该使用std::string,什么时候应该使用char*来管理C ++? 中的char s数组 似乎您应该使用char*如果性能(速度)至关重要,并且由于内存管理而愿意接受一些风险的业务. 还有其他情况需要考虑吗? 解决方案 您可以通过参考通过std::string s,如果它们很大以避免复制或指向该实例的指针,所以我不会使用char指针看到任何真正的优势. i使用std::string/wstring或多或少是实际文本的所有内容. char *不过,对于其他类型的数据很有用,您可以确定它会像应有的那样被划分.否则std::vector是要走的路. 所有这些都可能有例外. 其他解决方案 我的观点是: 如果您不调用" C"代码,切勿使用char *. 始终使用std :: string:它更容易,更友好,已进行了优化,它是标准的,它将阻止您患有错误,已被检查并证明是可行的. 其他解决方案 原始字符串用法 是
16 2024-03-04
编程技术问答社区
在C++中把字符串转换为argv
我有一个std ::字符串,其中包含要使用execv执行的命令,什么是将其转换为" char *argv []"的最佳" C ++"方法,这是Execv()的第二个参数所要求的. ? 澄清: std::string cmd = "mycommand arg1 arg2"; char *cmd_argv[]; StrToArgv(cmd, cmd_argv); // how do I write this function? execv(cmd_argv[0], cmd_argv); 解决方案 std::vector args; std::istringstream iss(cmd); std::string token; while(iss >> token) { char *arg = new char[token.size() + 1]; copy(token.begin(), token.end(), arg); arg[toke
22 2024-03-03
编程技术问答社区
有哪些算法可以比较两个字符串的相似程度?
我需要比较字符串来决定它们是否代表同一件事.这与人类输入的案例标题有关,缩写和其他小细节可能有所不同.例如,考虑以下两个标题: std::string first = "Henry C. Harper v. The Law Offices of Huey & Luey, LLP"; 而不是: std::string second = "Harper v. The Law Offices of Huey & Luey, LLP"; 人类可以迅速衡量这些很可能是一个又一个.我采用的当前方法是通过降低所有字母并删除所有标点符号和给出的空间来标准化字符串: std::string firstNormalized = "henrycharpervthelawofficesofhueylueyllp"; 和: std::string secondNormalized = "harpervthelawofficesofhueylueyllp"; 在这种情况下进行
26 2024-01-22
编程技术问答社区
如何替换字符串中出现的所有字符?
用std::string中的另一个字符替换所有字符的所有出现的有效方法是什么? 解决方案 std::string不包含此类功能,但是您可以使用algorithm标头的独立replace函数. #include #include void some_func() { std::string s = "example string"; std::replace( s.begin(), s.end(), 'x', 'y'); // replace all 'x' to 'y' } 其他解决方案 这个问题以character替换为中心,但是当我发现此页面非常有用(尤其是 konrad 的言论),我想分享这个更广泛的实现,它也允许处理substrings: std::string ReplaceAll(std::string str, const std::string& from, const std::string&
24 2024-01-22
编程技术问答社区
是否有等同于LPTSTR的字符串?
是否有等同于LPTSTR的字符串?我知道字符串和wstring.有Tstring吗? 解决方案 您可以定义一个: typedef std::basic_string mystring; ... mystring test = _T("Hello World!"); 其他解决方案 另一个选项(不需要windows.h): #if defined(_UNICODE) || defined(UNICODE) typedef std::wstring ustring_t; typedef wchar_t uchar_t; #define TEXT(x) (L##x) #else typedef std::string ustring_t; typedef char uchar_t; #define TEXT(x) (x) #endif 用法: ustring_t mystr = TEXT("hello world");
30 2023-12-06
编程技术问答社区
如何从std::string得到一个可写的C缓冲区?
我正在尝试将代码从使用MFC的CString到Microsoft Windows平台使用.我对某事感到好奇.在以下示例中说: CString MakeLowerString(LPCTSTR pStr) { CString strLower = pStr ? pStr : L""; CharLower(strLower.GetBuffer()); //Use WinAPI strLower.ReleaseBuffer(); return strLower; } 我使用strlower. getBuffer ()要传递到 charlower api.但是我在std::string中看不到类似的方法. 我想念什么吗?如果是这样,您将如何使用std::string>? 覆盖上述方法 解决方案 在我的新工作中,我们不使用MFC - 但是幸运的是STD Lib和C ++ 11-因此,我提出了与C00000FD相同的问题.多亏了Bi
24 2023-12-06
编程技术问答社区
将unicode UTF-8字符串存储在std::string中
回应 中的讨论 cross-platform strings(和unicode)in C ++ 我正在尝试将UTF-8字符串分配给Visual Studio 2010环境中的变量 std::string msg = "महसुस"; 但是,当我查看字符串视图调试器时,我只会看到" ????" 我将文件保存为Unicode(utf-8带签名) 而且我正在使用字符集"使用Unicode字符集" "महसुस"是一种尼泊尔语言,它包含5个字符,将占据15个字节.但是Visual Studio调试器显示味精大小为5 我的问题是: 如何使用std :: string仅存储UTF-8而无需操纵? 解决方案 如果您使用的是C ++ 11,那么这很容易: std::string msg = u8"महसुस"; 但是,由于您不是,因此您可以使用逃生序列,而不能依靠源文件的charset为您管理编码,这样您的代码更便携: std::strin
24 2023-12-05
编程技术问答社区
C++中的LPSTR和字符串问题与0 |终止的字符串有关
我正在使用Winapi>的GetOpenFileName函数,并且我将过滤器应用于选择文件对话框. 这个正常工作: LPSTR mfilter = "Filter\0*.PDF\0"; ofn.lpstrFilter = mfilter; if(GetOpenFileName(&ofn)){ ... 此失败(对话框打开但没有过滤器): string mfilter = "Filter\0*.PDF\0"; ofn.lpstrFilter = mfilter.c_str(); if(GetOpenFileName(&ofn)){ ... 我需要使用std:string,因为我通过参数获得了文件扩展名,并且这种类型有助于串联,但我遇到了不兼容的问题... 如果它按预期工作,这将是我的代码(失败与上一个示例相同): const char * ext = &(4:); //Ampersand parameter (from CA Plex) It con
16 2023-12-04
编程技术问答社区
有没有一种方法可以获得std:string's的缓冲区?
有没有办法获得" RAW"缓冲区o a std :: string? 我正在考虑类似于CString::GetBuffer()的东西.例如,使用Cstring我会做: CString myPath; ::GetCurrentDirectory(MAX_PATH+1, myPath.GetBuffer(MAX_PATH)); myPath.ReleaseBuffer(); 那么,std :: string是否有类似的东西? 解决方案 使用std::vector如果您想要真正的缓冲区. #include #include int main(){ std::vector buff(MAX_PATH+1); ::GetCurrentDirectory(MAX_PATH+1, &buff[0]); std::string path(buff.begin(), buff.end()); }
16 2023-12-04
编程技术问答社区
如何复制/设置一个volatile std::string?
如何复制volatile std::string?没有挥发性的复制构造函数,也没有c_str允许挥发性访问的东西. operator=似乎也不允许设置挥发性.似乎std::string是一个挥发性对象,根本无法使用.这是打算的,还是我错过了使用它的方法? 注意:我有轻松的解决方案,我只是在尝试在某些低级代码中使用字符串的同时提出了问题. 解决方案 正如您所指出的,std::string上的成员函数均未标记为volatile,因此您无法对volatile std::string进行任何操作.我认为唯一的选择是抛弃volatile ness并在结果上执行操作,如下所示: const_cast(myVolatileString) = "Now I'm different!" 从根本上讲,您可能不应该制作volatile std::string. volatile适用于可能被外部源突变或通过多个线程更改的对象.第一种情况非常不寻常,需要一些非常
16 2023-11-25
编程技术问答社区
Visual Studio调试器在调试时不能正确显示std::string
我和我的团队在我暂停程序时会出现视觉工作室的问题,而不是适当的字符串内容.内部的字符串具有正确的数据,只是vs的调试器以某种方式丢失了. 我以绿色标记了正确的内容,红色不正确. 您可以看到std::string定义为 const std::string testStdString = "contents of std::string"; 在调试悬停和手表窗口中显示为"\bÄĎD\x19".但是来自.c_str()的C弦显示很好.使用cout写入的控制台也可以很好地显示. 每次运行的损坏值都会改变. 在原始视图模式下,您可以看到指针内容显示为ASCII时,看起来像调试器认为是字符串内容的内容.所以也许一些简短的字符串优化相关问题? 如果将其解码为字符串: "\bÄĎD\x19" [0x00000000]: 0x08 '\b' [0x00000001]: 0xc4 'Ä' [0x00000002]: 0xcf 'Ď' [
30 2023-11-25
编程技术问答社区
如何修复Visual Studio 2012错误LNK2019:未解决的外部符号" __declspec(dllimport)public:class std :: basic_string?
如何修复Visual Studio 2012错误LNK2019:未解决的外部符号" __declspec(dllimport)public:class std :: basic_string? 我一直在编译包含一个EXE和几个静态LIB项目的解决方案 EXE在2008年视觉工作室中依赖于哪个.静态液体包括: tcl:tcl84tsx.lib wxwidgets:wxbase.lib zlib.lib WS2_32.lib xerces-c_2.lib SNMP研究Emanate:subgent.lib,agent.lib,emanate.lib,pack.lib,mibtable.lib,devkit.lib 等. 我将解决方案加载到Visual Studio 2012中,并编译了解决方案中的所有项目,但是当我尝试链接EXE时,我会在标准C ++库中的内容中遇到有关未解决的符号的错误,如下面的输出. 我发现很多人都有这样的符号,但没有任何修复程序对我有用.
std ::字符串数组元素访问
尽管是项目Euler计划,但以下代码实际上并不与之相关.我想添加50个100位数字,并且我将每个数字的每个数字分配给数组加成[100] [50]中的元素.然后,我将每个数字/位置分别添加,然后添加额外的数字.这些数字正在从名为Input.txt的文本文件中读取,并且仅包含所有数字. http://projecteuler.net/problem = 13 我从文件输入流()中将字符分配给字符串数组(string numbers[100][50])的元素遇到困难.该问题在评论中更彻底地描述了: " [对于第一个循环]此循环为字符串数组中的每个字符串分配一个数字.即使第二个数字(50)不做任何事情(STD :: String似乎被覆盖了声明),需要在那里才能工作.循环的"逻辑"相同;" j"无需做任何事情,而是需要在那里才能工作吗?" 以及(对于第二个循环)"此循环填充来自相应的字符串数组元素的"附加[100] [50]"数组.如果我尝试调用" char_
10 2023-11-23
编程技术问答社区