有什么方法吗?我的电脑是AMD64.
::std::string str;
BOOL loadU(const wchar_t* lpszPathName, int flag = 0);
Run Code Online (Sandbox Code Playgroud)
我用的时候:
loadU(&str);
Run Code Online (Sandbox Code Playgroud)
VS2005编译器说:
Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
我需要比较字符串来决定它们是否代表相同的东西.这涉及人类输入的案例标题,其中缩写和其他小细节可能不同.例如,请考虑以下两个标题:
std::string first = "Henry C. Harper v. The Law Offices of Huey & Luey, LLP";
Run Code Online (Sandbox Code Playgroud)
相反:
std::string second = "Harper v. The Law Offices of Huey & Luey, LLP";
Run Code Online (Sandbox Code Playgroud)
人类可以快速判断这些很可能是同一个.我采取的当前方法是通过降低所有字母的小写并删除所有标点和空格来规范化字符串:
std::string firstNormalized = "henrycharpervthelawofficesofhueylueyllp";
Run Code Online (Sandbox Code Playgroud)
和:
std::string secondNormalized = "harpervthelawofficesofhueylueyllp";
Run Code Online (Sandbox Code Playgroud)
在这种情况下比较,一个是另一个的子序列,但是您可以想象其他更复杂的变体,其中不一定会发生,但它们具有共同的重要子序列.也可能偶尔出现人为输入错误,例如转置字母和拼写错误.
也许某种角色差异程序可以帮助?我已经看到用于比较要检入的代码差异的良好行差异程序,在字符的基础上有类似的东西,也许在提升?如果你可以统计连续字符的数量并将比率与未共享的字符进行比较,那么这可能是一个很好的启发式算法?
最后,我需要一个布尔决定,是否将它们视为相同或不相同.它不一定是完美的,但理想情况下应该很少出错.
我可以使用什么算法来给我一些量化关于两个字符串彼此之间的相似程度,然后我可以通过某种启发式转换为是/否答案?
language-agnostic algorithm heuristics stdstring string-comparison
在我的文件的顶部,我有
#define AGE "42"
Run Code Online (Sandbox Code Playgroud)
稍后在文件中我多次使用ID,包括一些看起来像的行
1 std::string name = "Obama";
2 std::string str = "Hello " + name + " you are " + AGE + " years old!";
3 str += "Do you feel " + AGE + " years old?";
Run Code Online (Sandbox Code Playgroud)
我收到错误:
"错误:类型'const char [35]'和'const char [2]'到二进制'运算符+''的操作数无效"
第3行.我做了一些研究,发现这是因为C++如何处理不同的字符串,并且能够通过将"AGE"更改为"string(AGE)"来修复它.但是,直到今天我才意外地错过了其中一个实例,并且想知道为什么编译器没有抱怨,即使我还有一个只是"AGE"的实例.
通过一些反复试验,我发现我只需要string(AGE)在不连接函数体中创建的另一个字符串的行上.
我的问题是"在后台发生的事情是C++不喜欢将字符串与预处理器放置的字符串连接起来,除非你还连接了你在函数中定义的字符串."
我正在使用std::string并需要将它们留到给定的宽度.在C++中这样做的推荐方法是什么?
样本输入:
123
Run Code Online (Sandbox Code Playgroud)
填充到10个字符.
样本输出:
123
Run Code Online (Sandbox Code Playgroud)
(123前面7个空格)
一般来说,默认构造函数应该是创建空容器的最快方法。这就是为什么我惊讶地发现它比初始化为空字符串文字更糟糕:
#include <string>
std::string make_default() {
return {};
}
std::string make_empty() {
return "";
}
Run Code Online (Sandbox Code Playgroud)
编译为:(clang 16,libc++)
make_default():
mov rax, rdi
xorps xmm0, xmm0
movups xmmword ptr [rdi], xmm0
mov qword ptr [rdi + 16], 0
ret
make_empty():
mov rax, rdi
mov word ptr [rdi], 0
ret
Run Code Online (Sandbox Code Playgroud)
请参阅编译器资源管理器中的实时示例。
请注意,返回{}总共将 24 个字节归零,但返回""仅将 2 个字节归零。怎么会return "";好很多呢?
可能重复:
如何在C++中将字符串解析为int?
如何将C++字符串转换为int?
假设您希望字符串中包含实际数字(例如,"1","345","38944").
另外,让我们假设你没有提升,你真的想用C++方式来做,而不是狡猾的旧C方式.
std::string my_string = "";
char test = my_string[0];
Run Code Online (Sandbox Code Playgroud)
我注意到这不会崩溃,每次我测试它,测试都是0.
我可以依赖它总是0吗?还是随意的?
这是不好的编程吗?
编辑:从一些评论中,我认为对此的有用性存在一些误解.
这样做的目的不是检查字符串是否为空.不需要检查字符串是否为空.
情况是有一个字符串可能是空的也可能不是.我只关心这个字符串的第一个字符(如果它不是空的).
在我看来,检查字符串是否为空是不太有效,然后,如果它不是空的,请查看第一个字符.
if (! my_string.empty())
test = my_string[0];
else
test = 0;
Run Code Online (Sandbox Code Playgroud)
相反,我只需查看第一个字符,无需检查字符串是否为空.
test = my_string[0];
Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
#include <iostream>
#include <string>
// void f(const char *) { std::cout << "const char *"; } // <-- comment on purpose
void f(const std::string &) { std::cout << "const std::string &"; }
void f(const void *) { std::cout << "const void *"; }
int main()
{
f("hello");
std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我编译了这个程序g++ (Ubuntu 6.5.0-1ubuntu1~16.04) 6.5.0 20181026:
$ g++ -std=c++11 strings_1.cpp -Wall
$ ./a.out
const void *
Run Code Online (Sandbox Code Playgroud)
请注意,注释是为了测试而存在,否则编译器使用f(const char *).
那么,为什么编译器会f(const void*)接管f(const std::string …
c++ overloading stdstring string-literals overload-resolution
我有一些不同长度的数字(如1,999,76492,等等),我想将它们全部转换为具有共同长度的字符串(例如,如果长度为6,那么这些字符串将为:'000001' ,'000999','076492').
换句话说,我需要在数字中添加正确数量的前导零.
int n = 999;
string str = some_function(n,6);
//str = '000999'
Run Code Online (Sandbox Code Playgroud)
在C++中有这样的函数吗?
我正在阅读Anthony Williams的"行动中的C++并发"和第5章,其中讨论了新的多线程感知内存模型和原子操作,并指出:
为了
std::atomic<UDT>用于某些用户定义的UDT类型,此类型必须具有普通的复制赋值运算符.
据我了解,这意味着std::atomic<UDT>如果以下内容返回true ,我们可以使用:
std::is_trivially_copyable<UDT>::value
Run Code Online (Sandbox Code Playgroud)
通过这种逻辑,我们不应该使用它std::string作为模板参数std::atomic并使其正常工作.
但是,以下代码使用预期输出进行编译和运行:
#include <atomic>
#include <thread>
#include <iostream>
#include <string>
int main()
{
std::atomic<std::string> atomicString;
atomicString.store( "TestString1" );
std::cout << atomicString.load() << std::endl;
atomicString.store( "TestString2" );
std::cout << atomicString.load() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一个未定义的行为,恰好按预期行事吗?
提前致谢!