相关疑难解决方法(0)

C++ 11中COW std :: string实现的合法性

据我所知,写时复制不是std::string在C++ 11中实现符合性的可行方法,但最近在讨论中我发现自己无法直接支持该语句.

我是否正确C++ 11不承认基于COW的实现std::string

如果是这样,这个限制是否在新标准(其中)的某处明确说明了?

或者这个限制是否暗示,因为新要求的综合影响std::string排除了基于COW的实施std::string.在这种情况下,我会对"C++ 11有效禁止基于COW的std::string实现" 的章节和样式推导感兴趣.

c++ string stdstring copy-on-write c++11

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

std :: string常量的正确习惯用法?

我有一个代表DB对象的地图.我希望从中得到"众所周知"的价值观

 std::map<std::string, std::string> dbo;
 ...
 std::string val = map["foo"];
Run Code Online (Sandbox Code Playgroud)

一切都很好但是我觉得"foo"在每次通话时都被转换为临时字符串.当然,拥有一个常量的std :: string会更好(当然,与刚刚获取对象的磁盘IO相比,它可能只是一个很小的开销,但我认为它仍然是一个有效的问题).那么std :: string常量的正确习惯是什么?

例如 - 我可以

 const std::string FOO = "foo";
Run Code Online (Sandbox Code Playgroud)

在hdr中,但后来我得到了多份副本

编辑:还没有回答说如何声明std :: string常量.忽略整个地图,STL等问题.很多代码都是以std :: string为导向的(我当然是这样)并且很自然地需要为它们设置常量而不需要为内存分配反复付费

EDIT2:从曼努埃尔手中接过PDF回答的二级问题,添加了一个不好习惯的例子

编辑3:答案摘要.请注意,我没有包含那些建议创建新字符串类的内容.我很失望,因为我希望有一个简单的东西只能在头文件中工作(如const char*const).无论如何

a)来自马克b

 std::map<int, std::string> dict;
 const int FOO_IDX = 1;
 ....
 dict[FOO_IDX] = "foo";
 ....
 std:string &val = dbo[dict[FOO_IDX]];
Run Code Online (Sandbox Code Playgroud)

b)来自vlad

 // str.h
 extern const std::string FOO;
 // str.cpp
 const std::string FOO = "foo";
Run Code Online (Sandbox Code Playgroud)

c)来自Roger P.

 // really you cant do it
Run Code Online (Sandbox Code Playgroud)

(b)似乎与我想要的最接近,但有一个致命的缺陷.我不能拥有使用这些字符串的静态模块级代码,因为它们可能尚未构建.我想过(a)​​并且实际上在序列化对象时使用类似的技巧,发送索引而不是字符串,但对于通用解决方案来说似乎有很多管道.很遗憾(c)获胜,std:string 没有简单的常量

c++ string constants

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

两个字符串文字具有相同的指针值?

当我使用MinGW运行此程序时,我输出为"="

#include<iostream>

using namespace std;

int main()
{
 char *str1 = "Hello";
 char *str2 = "Hello";

 if(str1==str2)
 cout<<"=";
 else
 cout<<"!=";


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

但是,从逻辑上讲,它应该是!=,因为这些是指针,它们指向不同的内存位置.当我在Turbo C++中运行此代码时,我得到了!=

c++ string pointers

8
推荐指数
2
解决办法
1784
查看次数

标签 统计

c++ ×3

string ×3

c++11 ×1

constants ×1

copy-on-write ×1

pointers ×1

stdstring ×1