我很想知道如何实现std :: string以及它与c字符串的区别?如果标准没有指定任何实现,那么任何带有解释的实现都会很好,它如何满足标准给出的字符串要求?
我正在尝试创建std::function一个移动捕获lambda表达式.请注意,我可以创建一个移动捕获lambda表达式而不会出现问题; 只有当我尝试将其包装成一个std::function我得到错误时.
例如:
auto pi = std::make_unique<int>(0);
// no problems here!
auto foo = [q = std::move(pi)] {
*q = 5;
std::cout << *q << std::endl;
};
// All of the attempts below yield:
// "Call to implicitly-deleted copy constructor of '<lambda...."
std::function<void()> bar = foo;
std::function<void()> bar{foo};
std::function<void()> bar{std::move(foo)};
std::function<void()> bar = std::move(foo);
std::function<void()> bar{std::forward<std::function<void()>>(foo)};
std::function<void()> bar = std::forward<std::function<void()>>(foo);
Run Code Online (Sandbox Code Playgroud)
我会解释为什么我要写这样的东西.我写了一个UI库,类似于jQuery的或JavaFX的,允许用户通过传递给处理鼠标/键盘事件std::functions到方法有相似的名字on_mouse_down(),on_mouse_drag(),push_undo_action(),等.
显然,std::function我想要传入的理想情况下应该使用移动捕获lambda表达式,否则我需要求助于我在C++ 11作为标准时使用的丑陋的"release/acquire-in-lambda"习语:
std::function<void()> baz = …Run Code Online (Sandbox Code Playgroud) 我理解为什么不能这样做的原因(重新平衡和东西):
iterator i = m.find(33);
if (i != m.end())
i->first = 22;
Run Code Online (Sandbox Code Playgroud)
但到目前为止,改变密钥的唯一方法(我知道)是从树中删除节点,然后使用不同的密钥插入值:
iterator i = m.find(33);
if (i != m.end())
{
value = i->second;
m.erase(i);
m[22] = value;
}
Run Code Online (Sandbox Code Playgroud)
由于更多原因,这似乎对我来说效率很低:
我发现分配和释放是这三者中最差的.我错过了什么或有更有效的方法吗?
更新:我认为,从理论上讲,它应该是可能的,所以我不认为改变不同的数据结构是合理的.这是我想到的伪算法:
如何将std :: chrono :: time_point转换为带有小数秒的日历日期时间字符串?例如:"10-10-2012 12:38:40.123456".
我有一个应用程序正在对某些图像执行某些处理.
鉴于我知道宽度/高度/格式等(我这样做),并考虑定义一个缓冲区来存储像素数据:
然后,而不是使用new与delete []上unsigned char*并保持一个单独的说明缓冲区大小的,我想通过使用简化的事情std::vector.
所以我会宣布我的课程是这样的:
#include <vector>
class MyClass
{
// ... etc. ...
public:
virtual void OnImageReceived(unsigned char *pPixels,
unsigned int uPixelCount);
private:
std::vector<unsigned char> m_pImageBuffer; // buffer for 8-bit pixels
// ... etc. ...
};
Run Code Online (Sandbox Code Playgroud)
然后,当我收到一个新图像(一些可变大小 - 但不要担心这些细节)时,我可以调整矢量大小(如果需要)并复制像素:
void MyClass::OnImageReceived(unsigned char *pPixels, unsigned int uPixelCount)
{
// called when a new image is available
if (m_pImageBuffer.size() != uPixelCount)
{
// resize image buffer
m_pImageBuffer.reserve(uPixelCount);
m_pImageBuffer.resize(uPixelCount, 0);
}
// copy …Run Code Online (Sandbox Code Playgroud) 为什么返回的字符串ctime()有一个换行符(0x0A)作为最终字符?例如,这段代码:
#include <iostream>
#include <cstdlib>
int main(int argc, char* argv[])
{
time_t now;
time(&now);
char* time_str = ctime(&now);
std::cout << time_str << "why is this on a new line?" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...产生以下输出:
$ ./time.exe
Wed Oct 23 14:52:29 2013
why is this on a new line?
$
Run Code Online (Sandbox Code Playgroud)
没什么大不了的; 我可以从字符串中删除最后一个字节,但为什么ctime()要把它放在首位呢?
考虑我有一个自定义类型(我可以扩展):
struct Foo {
int a;
string b;
};
Run Code Online (Sandbox Code Playgroud)
如何将此对象的实例分配给a std::tie,即std::tuple引用?
Foo foo = ...;
int a;
string b;
std::tie(a, b) = foo;
Run Code Online (Sandbox Code Playgroud)
尝试失败:
tuple<int&,string&> = Foo由于赋值运算符是必须是左侧对象成员的二元运算符之一,因此无法重载赋值运算符.
所以我试图通过实现一个合适的元组转换运算符来解决这个问题.以下版本失败:
operator tuple<int,string>() constoperator tuple<const int&,const string&>() const它们导致赋值错误,告诉" operator =没有超载tuple<int&,string&> = Foo".我想这是因为"转换为任何类型的X +推导模板参数X for operator ="不能同时工作,只能同时使用其中一个.
不完美的尝试:
因此,我尝试为绑定的确切类型实现转换运算符:
现在分配工作,因为类型现在(转换后)完全相同,但这不适用于我想支持的三种情况:
int a;为long long a;客户端),则失败,因为类型必须完全匹配.这与将元组分配给允许可转换类型的引用元组的通常用法相矛盾.(1)我一直在一堆不同的论坛上徘徊,我似乎每次都会看到这种情况.这是一个非常初学的问题.
我通常定义一个程序
#include<string>
using namespace std;
string x;
Run Code Online (Sandbox Code Playgroud)
我看到一堆代码示例将字符串定义为
std::string.
Run Code Online (Sandbox Code Playgroud)
这样做的目的是什么?是好的做法还是有一些功能?
什么时候需要使用-stdlib=libstdc++gcc编译时使用编译器和链接器的标志?
编译器是否自动使用libstdc ++?
我在Ubuntu 13.10上使用gcc4.8.2,我想使用c ++ 11标准.我已经传递-std=c++11给了编译器.
我正在使用android NDK r9d和toolchain 4.8但我无法使用std :: to_string函数,编译器抛出此错误:
error: 'to_string' is not a member of 'std'
Run Code Online (Sandbox Code Playgroud)
android ndk不支持此功能吗?我试着APP_CPPFLAGS := -std=c++11没有运气.
c++ ×10
std ×10
c++11 ×3
string ×3
android ×1
android-ndk ×1
binary-tree ×1
c ×1
c++-chrono ×1
c++14 ×1
cstring ×1
datetime ×1
gcc ×1
lambda ×1
libstdc++ ×1
map ×1
performance ×1
stdvector ×1
time ×1
tuples ×1