标签: std

如何实现std :: string?

我很想知道如何实现std :: string以及它与c字符串的区别?如果标准没有指定任何实现,那么任何带有解释的实现都会很好,它如何满足标准给出的字符串要求?

c++ string std cstring

53
推荐指数
4
解决办法
5万
查看次数

如何从移动捕获lambda表达式创建一个std :: function?

我正在尝试创建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)

c++ lambda std c++14

52
推荐指数
3
解决办法
7066
查看次数

在std :: map中更改元素键的最快方法是什么

我理解为什么不能这样做的原因(重新平衡和东西):

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)

由于更多原因,这似乎对我来说效率很低:

  1. 遍历树三次(+余额)而不是两次(+余额)
  2. 还有一个不必要的价值副本
  3. 不必要的重新分配,然后重新分配树内的节点

我发现分配和释放是这三者中最差的.我错过了什么或有更有效的方法吗?

更新:我认为,从理论上讲,它应该是可能的,所以我不认为改变不同的数据结构是合理的.这是我想到的伪算法:

  1. 找到树中我想要更改其键的节点.
  2. 如果从树上分离(不要解除分配)
  3. 重新平衡
  4. 更改分离节点内的密钥
  5. 将节点插回树中
  6. 重新平衡

c++ performance binary-tree std map

51
推荐指数
5
解决办法
4万
查看次数

如何将std :: chrono :: time_point转换为带有小数秒的日历日期时间字符串?

如何将std :: chrono :: time_point转换为带有小数秒的日历日期时间字符串?例如:"10-10-2012 12:38:40.123456".

c++ datetime std c++11 c++-chrono

51
推荐指数
4
解决办法
8万
查看次数

将std :: vector用作简单缓冲区是一种好习惯吗?

我有一个应用程序正在对某些图像执行某些处理.

鉴于我知道宽度/高度/格式等(我这样做),并考虑定义一个缓冲区来存储像素数据:

然后,而不是使用newdelete []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)

c++ std stdvector

50
推荐指数
4
解决办法
1万
查看次数

为什么ctime()返回的字符串包含换行符?

为什么返回的字符串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()要把它放在首位呢?

c c++ string time std

50
推荐指数
2
解决办法
5198
查看次数

使自定义类型"绑定"(与std :: tie兼容)

考虑我有一个自定义类型(我可以扩展):

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>() const
  • operator tuple<const int&,const string&>() const

它们导致赋值错误,告诉" operator =没有超载tuple<int&,string&> = Foo".我想这是因为"转换为任何类型的X +推导模板参数X for operator ="不能同时工作,只能同时使用其中一个.

不完美的尝试:

因此,我尝试为绑定确切类型实现转换运算符:

  • operator tuple<int&,string&>() const   Demo
  • operator tuple<int&,string&>()   Demo

现在分配工作,因为类型现在(转换后)完全相同,但这不适用于我想支持的三种情况:

  1. 如果tie有不同但可转换类型的变量绑定(即更改int a;long long a;客户端),则失败,因为类型必须完全匹配.这与将元组分配给允许可转换类型的引用元组的通常用法相矛盾.(1)
  2. 转换运算符需要返回一个必须给出左值引用的平局.这不适用于临时值或const成员. …

c++ tuples std c++11

50
推荐指数
3
解决办法
4588
查看次数

cd中的std :: string vs string

可能重复:
为什么'using namespace std;' 在C++中被认为是一种不好的做法?
使用std命名空间

我一直在一堆不同的论坛上徘徊,我似乎每次都会看到这种情况.这是一个非常初学的问题.

我通常定义一个程序

#include<string>
using namespace std;

string x;
Run Code Online (Sandbox Code Playgroud)

我看到一堆代码示例将字符串定义为

std::string.
Run Code Online (Sandbox Code Playgroud)

这样做的目的是什么?是好的做法还是有一些功能?

c++ string std

49
推荐指数
3
解决办法
6万
查看次数

什么时候需要使用标志-stdlib = libstdc ++?

什么时候需要使用-stdlib=libstdc++gcc编译时使用编译器和链接器的标志?

编译器是否自动使用libstdc ++?

我在Ubuntu 13.10上使用gcc4.8.2,我想使用c ++ 11标准.我已经传递-std=c++11给了编译器.

c++ gcc std libstdc++ c++11

48
推荐指数
3
解决办法
7万
查看次数

Android ndk std :: to_string支持

我正在使用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++ android std c++-standard-library android-ndk

48
推荐指数
3
解决办法
3万
查看次数