标签: stdstring

std :: string如何管理这个技巧?

我刚写了一个函数:

void doSomeStuffWithTheString(const std::string& value) {
...
std::string v = value;
std::cout << value.c_str();
...
}
Run Code Online (Sandbox Code Playgroud)

但后来我称之为

doSomeStuffWithTheString("foo");
Run Code Online (Sandbox Code Playgroud)

它的工作原理.所以我认为这个工作(const char*初始化std :: string的隐式实例)该值必须通过值传递,但在这种情况下通过(const)引用传递.

当引用是const时,是否有任何机会从const char*实例化一个隐式的temporal std :: string?如果没有,那么这可能如何运作?

编辑

如果函数重载会发生什么

void doSomeStuffWithTheString(const char* value);
Run Code Online (Sandbox Code Playgroud)

哪一个会选择编译器?

c++ pass-by-reference stdstring pass-by-const-reference

5
推荐指数
1
解决办法
518
查看次数

Valgrind内存泄漏与std :: map中的std :: string

这是Valgrind的输出:

==6519==    at 0x4C25885: operator new(unsigned long) (vg_replace_malloc.c:319)
==6519==    by 0x4EE65D8: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (new_allocator.h:104)
==6519==    by 0x4EE7CE0: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (basic_string.tcc:138)
==6519==    by 0x4EE80F7: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (basic_string.h:1725)
==6519==    by 0x41C399: pilInpOpts::pilInpOpts() (pilInpOpts.cpp:12)
==6519==    by 0x403A55: main (main.cpp:32)
Run Code Online (Sandbox Code Playgroud)

对于地图中的每个条目重复相同的错误.

main.cpp第32行是:

    pilInpOpts input;
Run Code Online (Sandbox Code Playgroud)

pilInpOpts的第12行是构造函数的一部分:

#include "pilInpOpts.h"
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>


pilInpOpts::pilInpOpts() 
{
// create the map of options, put in alphabetical order to …
Run Code Online (Sandbox Code Playgroud)

c++ valgrind stdmap stdstring

5
推荐指数
1
解决办法
2347
查看次数

将通过复制传递std :: string进行优化吗?

在我们的项目中有许多函数,其中字符串通过副本传递:

void f(std::string a);
Run Code Online (Sandbox Code Playgroud)

众所周知,通过引用传递它会更有效,但我的同事说编译器无论如何都会优化它.这对GCC来说是否接近真相?

发布版本中启用了G ++ 4.8.2,-O2.

谢谢!

c++ gcc stdstring

5
推荐指数
1
解决办法
105
查看次数

导入matplotlib.pyplot时的Matplotlib TypeError

我刚用conda来更新我的Anaconda安装,Matplotlib从v1.4.0升级到v1.4.2.但是现在我使用Matplotlib.pyplot的所有Python作业都抛出异常.

即使是简单的命令:

import matplotlib.pyplot as plt
Run Code Online (Sandbox Code Playgroud)

抛出TypeError异常,说:

无法从Unicode对象返回std :: string

回溯告诉我在font_manager.py文件中发生了异常,这里:

try:
    font = ft2font.FT2Font(fpath)
except RuntimeError:
    verbose.report("Could not open font file %s" % fpath)
    continue
except UnicodeError:
    verbose.report("Cannot handle unicode filenames")
    continue
Run Code Online (Sandbox Code Playgroud)

特别是在线font = ft2font.FT2Font(fpath).

我尝试回到Matplotlib的v1.4.0,但它没有解决问题.

然后我编辑了font_manager.py来添加一般的异常情况:

except:
    verbose.report("Some stupid error occurred")
    continue
Run Code Online (Sandbox Code Playgroud)

希望它会暂时解决它所遇到的问题,但是这个错误或者与之类似的错误会在以后发生.所以我删除了异常,但错误现在仍然发生在代码的后一点(所以如果我运行import matplotlib.pyplot as plt它,但执行其他命令可能会失败).

我使用Matplotlib全天生成/更新数百个图表,现​​在一切都坏了.

请帮忙!谢谢!

matplotlib stdstring typeerror python-2.7

5
推荐指数
1
解决办法
381
查看次数

从std:string派生以添加typedef和enums

对于客户端和服务器之间交换的UDP包,我想支持两种字符串字段:

  • 以null结尾的c-string命名 cstring
  • 前面写有uint8_tsize-field的字符串vstring

要自我记录我们的包的布局,我想使用简单的结构声明:

struct ABC {
  vstring a;
  cstring b;
}
Run Code Online (Sandbox Code Playgroud)

并调用重载函数get(char*, vstring& v)和get(char*, cstring&)内部de /序列化函数,如下所示:

void deserialize(const char* bytes, ABC& msg) {
  get(msg.a);
  get(msg.b);
}

void serialize(char* bytes, const ABC& msg) {
  put(msg.a);
  put(msg.b);
}
Run Code Online (Sandbox Code Playgroud)

但是,对于用户而言vstring,cstring理想情况下应该像正常一样std::string.

我的第一个想法是简单地进行std::string的民意基础vstring,并cstring使得两个类可以超载解析期间,disriminated而是表现为用户相同.但由于std::string劝阻,我不确定该怎么办.

c++ inheritance stdstring c++11

5
推荐指数
1
解决办法
157
查看次数

如何从std :: string获取可写C缓冲区?

我正在尝试将我的代码从使用MFC移植CString到std::stringMicrosoft Windows平台.而且我对某些事感到好奇.在以下示例中说:

CString MakeLowerString(LPCTSTR pStr)
{
    CString strLower = pStr ? pStr : L"";
    CharLower(strLower.GetBuffer());        //Use WinAPI
    strLower.ReleaseBuffer();

    return strLower;
}
Run Code Online (Sandbox Code Playgroud)

我用strLower.GetBuffer()获取要传递给CharLower API 的可写缓冲区.但我没有看到类似的方法std::string.

我错过了什么吗?如果是这样,您将如何覆盖上述方法std::string?

c++ windows mfc stdstring

5
推荐指数
2
解决办法
2612
查看次数

这个std :: string构造函数的含义是什么?

今天我试着研究一些代码,我坚持这条线.

std::vector<std::string(SomeClassInterface::*)()> ListOfFnPointers;
Run Code Online (Sandbox Code Playgroud)

这个std :: string构造函数的含义是什么?我经历过这个,但我不知道它意味着什么.

它在代码中用作,

if (!ListOfFnPointers.empty())
{
    std::vector<std::string> StringList;
    for (auto Fn : ListOfFnPointers)
    {
        StringList.push_back((pSomeClassObj->*Fn)());
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)
  1. 该声明是什么意思?
  2. 这个功能到底在做什么pSomeClassObj->*Fn?

c++ string stdstring c++11

5
推荐指数
1
解决办法
949
查看次数

const std :: string&s = nullptr如何作为可选参数

据我所知,引用不能为空,但是当我运行这样的代码时:

#include <iostream>
#include <string>

void test(int i, const std::string& s = nullptr) {
  std::cout << i << " " << s << std::endl;
}

int main() {
  test(1, "test");
  test(2);
}
Run Code Online (Sandbox Code Playgroud)

可选参数s可以为null,并生成代码。此外,test(2)运行时,程序将引发异常,而不是打印一些随机字符串。

当我更改s为int之类的基本类型时,它无法编译,因此我认为魔术仍然保留在字符串类中,但是如何?

而且,如何检查是否s为null?如果我使用if(s==nullptr)或if(s.empty()),它将无法编译。

c++ reference initializer stdstring nullptr

5
推荐指数
1
解决办法
214
查看次数

代表日期的字符串并将其转换

要格式化表示从其他部分收到的日期的字符串,需要进行一些转换:

source:
    std::string s = "20190510";
target:
    std::string t = "05/10/2019";
Run Code Online (Sandbox Code Playgroud)

一种方法是逐个字符地复制char,是否有一种优雅的方法可以使其美观又快速?

更新:对不起,转换应该是从“ yyyymmdd”到“ mm / dd / yyyy”。

c++ string stdstring c++11

5
推荐指数
1
解决办法
127
查看次数

我可以使用 istream_iterator&lt;char&gt; 将一些 istream 内容复制到 std::string 中吗?

我有一个istream并且需要将两个分隔符之间的内容复制到一个std::string. 我可以找到定界符' streampos,但是当尝试使用它istream_iterator<char>来遍历流的部分时,它不起作用。这是我尝试过的:

#include <iostream>
#include <sstream>
#include <iterator>


std::string copyToString( std::istream& is )
{
    is >> std::ws;

    auto someLength {10};

    std::istream_iterator<char> beg {is};

    is.seekg( someLength, std::ios::cur );

    //std::istream_iterator<char> end { is };
    std::istream_iterator<char> end { std::next(beg, someLength) };

    return std::string{ beg, end };
}




int main()
{
    std::stringstream ss;
    ss.str( "   { my string content  }" );

    std::cout << "\"" << copyToString( ss ) << "\"\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我预计输出长度为 10 个字符,但它只是 …

c++ stdstring istream-iterator istream input-iterator

5
推荐指数
1
解决办法
222
查看次数