我听取了香草萨特最近的谈话谁建议的理由来传递std::vector和std::string利用const &在很大程度上消失了.他建议现在更好地编写如下函数:
std::string do_something ( std::string inval )
{
std::string return_val;
// ... do stuff ...
return return_val;
}
Run Code Online (Sandbox Code Playgroud)
我理解return_val在函数返回时将是一个rvalue,因此可以使用非常便宜的移动语义返回.但是,inval仍然远大于引用的大小(通常实现为指针).这是因为a std::string具有各种组件,包括指向堆的指针和char[]用于短字符串优化的成员.所以在我看来,通过引用传递仍然是一个好主意.
谁能解释为什么Herb可能会说这个?
使用Vim时我已经启用了很多插件 - 多年来我收集了插件.我有点厌倦了Vim现在需要多长时间,所以我想介绍一下它的启动,看看我有哪些插件负责.
有没有办法分析Vim的启动或脚本运行?理想情况下,我想知道Vim在加载的每个Vim脚本中花了多长时间.
std::string和之间有什么区别std::basic_string?为什么两者都需要?
考虑以下程序,它将一系列元素插入到向量中:
vector<string> v1;
vector<string> v2;
v1.push_back("one");
v1.push_back("two");
v1.push_back("three");
v2.push_back("four");
v2.push_back("five");
v2.push_back("six");
v1.insert(v1.end(), v2.begin(), v2.end());
Run Code Online (Sandbox Code Playgroud)
这有效地复制了范围,在整个范围内为目标矢量分配了足够的空间,因此最多需要一个调整大小.现在考虑以下程序尝试将范围移动到向量中:
vector<string> v1;
vector<string> v2;
v1.push_back("one");
v1.push_back("two");
v1.push_back("three");
v2.push_back("four");
v2.push_back("five");
v2.push_back("six");
for_each ( v2.begin(), v2.end(), [&v1]( string & s )
{
v1.emplace_back(std::move(s));
});
Run Code Online (Sandbox Code Playgroud)
这会执行成功的移动,但不会享受insert()在目标向量中预分配空间方面的优势,因此在操作期间可以多次调整向量的大小.
所以我的问题是,是否有一个插入等效项可以将范围移动到向量中?
如果我有一个表格,其中一个字段被声明为接受varchar(100)然后我实际插入单词"hello"将在mysql服务器上使用多少真实存储空间?即使声明了varchar(100),插入NULL也会导致没有使用存储?
答案是什么,它是否与不同的数据库实现一致?
我用Vim编辑各种文件(因为我确信大多数Vim用户都这样做).我遇到的一个错误就是Vim在遇到带有奇数编码的文件时所做的事情.大多数编辑(这些天)在检测文件编码方面做得很好.但是,Vim通常不会.你必须键入,例如:
:e ++enc=utf-16le
Run Code Online (Sandbox Code Playgroud)
以UTF-16重新读取文件(否则你会获得大量的@符号)
我一直在搜索并看过set_utf8.vim可以检测特定文件编码的脚本.但是,有更一般的解决方案吗?我有点无聊,必须手动计算文件编码是什么,并在每次打开一个不寻常的文件时咨询帮助.
我一直在看std :: nth_element算法,显然:
重新排列[first,last]范围内的元素,使得生成的第n个位置的元素是在排序序列中处于该位置的元素,其前面的元素都不是更大而且没有跟随它的元素比它小.它前面的元素和后面的元素都不能保证订购.
但是,使用我的编译器,运行以下命令:
vector<int> myvector;
srand(GetTickCount());
// set some values:
for ( int i = 0; i < 10; i++ )
myvector.push_back(rand());
// nth_element around the 4th element
nth_element (myvector.begin(), myvector.begin()+4, myvector.end());
// print results
for (auto it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
Run Code Online (Sandbox Code Playgroud)
始终以与std :: sort相同的方式返回完全排序的整数列表.我错过了什么吗?这个算法对什么有用?
编辑:好的以下示例使用更大的集合表明存在很大差异:
vector<int> myvector;
srand(GetTickCount());
// set some values:
for ( int i = 0; i < RAND_MAX; i++ )
myvector.push_back(rand());
// nth_element around the 4th …Run Code Online (Sandbox Code Playgroud) 如果std :: vector和朋友自我调整大小,这是否意味着如果我声明一个这样的向量:
std::vector<string> myvec;
Run Code Online (Sandbox Code Playgroud)
然后它将使用更多堆栈调整大小,而:
std::vector<string> *myvec = new std::vector<string>();
Run Code Online (Sandbox Code Playgroud)
会使用更多堆调整大小吗?
我是C#的新手(来自原生C++背景),我正在尝试编写一个小UI来打印Windows广播消息等.我在我的C#程序中重写了默认的WndProc消息循环,如下所示:
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
protected override void WndProc(ref Message m)
{
// Listen for operating system broadcasts.
switch (m.Msg)
{
case WM_SETTINGCHANGE:
this.richTextLog.Text += "WM_SETTINGCHANGE - lParam=" + m.LParam.ToString() + "\n";
break;
}
base.WndProc(ref m);
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,如何获取intPatr类型的lParam对象的字符串表示.它本质上是C++领域的一个空白*,我能以某种方式将它转换为C#吗?据推测,这样做本质上是不安全的.
是否可以在批处理文件中的回显行中添加新的行字符?
基本上我希望能够做到相当于:
echo Hello\nWorld
Run Code Online (Sandbox Code Playgroud)
您可以在Linux中轻松完成此操作,但我无法解决如何在Windows中执行此操作.