我刚写了一个函数:
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)
哪一个会选择编译器?
这是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) 在我们的项目中有许多函数,其中字符串通过副本传递:
void f(std::string a);
Run Code Online (Sandbox Code Playgroud)
众所周知,通过引用传递它会更有效,但我的同事说编译器无论如何都会优化它.这对GCC来说是否接近真相?
发布版本中启用了G ++ 4.8.2,-O2.
谢谢!
我刚用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全天生成/更新数百个图表,现在一切都坏了.
请帮忙!谢谢!
对于客户端和服务器之间交换的UDP包,我想支持两种字符串字段:
cstringuint8_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劝阻,我不确定该怎么办.
我正在尝试将我的代码从使用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?
今天我试着研究一些代码,我坚持这条线.
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)
pSomeClassObj->*Fn?据我所知,引用不能为空,但是当我运行这样的代码时:
#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()),它将无法编译。
要格式化表示从其他部分收到的日期的字符串,需要进行一些转换:
source:
std::string s = "20190510";
target:
std::string t = "05/10/2019";
Run Code Online (Sandbox Code Playgroud)
一种方法是逐个字符地复制char,是否有一种优雅的方法可以使其美观又快速?
更新:对不起,转换应该是从“ yyyymmdd”到“ mm / dd / yyyy”。
我有一个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 个字符,但它只是 …
stdstring ×10
c++ ×9
c++11 ×3
string ×2
gcc ×1
inheritance ×1
initializer ×1
istream ×1
matplotlib ×1
mfc ×1
nullptr ×1
python-2.7 ×1
reference ×1
stdmap ×1
typeerror ×1
valgrind ×1
windows ×1