- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我注意到在我的 SGI STL 引用拷贝中,有一个关于 Character Traits 的页面,但我看不到它们是如何使用的?它们会替换 string.h 函数吗? std::string
似乎没有使用它们,例如length()
方法在 std::string
不使用字符特性 length()
方法。为什么会存在 Character Traits 并且它们是否曾在实践中使用过?
最佳答案
字符特征是流和字符串库的一个极其重要的组成部分,因为它们允许流/字符串类将存储哪些字符的逻辑与应该对这些字符执行的操作的逻辑分开。
首先,默认的字符特征类,char_traits<T>
, 在 C++ 标准中被广泛使用。例如,没有名为 std::string
的类。 .相反,有一个类模板 std::basic_string
看起来像这样:
template <typename charT, typename traits = char_traits<charT> >
class basic_string;
std::string
被定义为
typedef basic_string<char> string;
template <typename charT, typename traits = char_traits<charT> >
class basic_istream;
typedef basic_istream<char> istream;
std::string
,但具有一些略有不同的属性。一个典型的例子是,如果您想以一种忽略大小写的方式存储字符串。例如,我可能想创建一个名为
CaseInsensitiveString
的字符串。这样我就可以拥有
CaseInsensitiveString c1 = "HI!", c2 = "hi!";
if (c1 == c2) { // Always true
cout << "Strings are equal." << endl;
}
std::string
的代码。获取不区分大小写的字符串。
compare
定义的。功能。这个函数又通过调用来定义
traits::compare(this->data(), str.data(), rlen)
str
是您要比较的字符串和
rlen
是两个字符串长度中较小的一个。这其实挺有意思的,因为这意味着
compare
的定义直接使用
compare
由指定为模板参数的特征类型导出的函数!因此,如果我们定义一个新的traits 类,那么定义
compare
为了不区分大小写地比较字符,我们可以构建一个行为类似于
std::string
的字符串类。 ,但不区分大小写!
std::char_traits<char>
获取我们未编写的所有函数的默认行为:
class CaseInsensitiveTraits: public std::char_traits<char> {
public:
static bool lt (char one, char two) {
return std::tolower(one) < std::tolower(two);
}
static bool eq (char one, char two) {
return std::tolower(one) == std::tolower(two);
}
static int compare (const char* one, const char* two, size_t length) {
for (size_t i = 0; i < length; ++i) {
if (lt(one[i], two[i])) return -1;
if (lt(two[i], one[i])) return +1;
}
return 0;
}
};
eq
和
lt
,它们分别比较了相等和小于的字符,然后根据此函数定义了
compare
)。
CaseInsensitiveString
微不足道的
typedef std::basic_string<char, CaseInsensitiveTraits> CaseInsensitiveString;
char_traits
在该类型上,然后从该类型制作字符串。例如,在 Windows API 中,有一个类型
TCHAR
这是一个窄字符或宽字符,具体取决于您在预处理期间设置的宏。然后你可以用
TCHAR
制作字符串s 通过写作
typedef basic_string<TCHAR> tstring;
TCHAR
s。
basic_string
作者只需要指定如何使用特征,我们就可以神奇地让它们使用我们的特征而不是默认特征来获取具有一些细微差别或怪癖的字符串,而不是默认字符串类型的一部分。
std::string
不使用
traits::length
,事实证明它在几个地方确实如此。最值得注意的是,当您构建
std::string
时出
char*
C 风格的字符串,字符串的新长度是通过调用
traits::length
导出的在那根弦上。看来
traits::length
主要用于处理 C 风格的字符序列,这是 C++ 中字符串的“最小公分母”,而
std::string
用于处理任意内容的字符串。
关于c++ - STL Character Traits 的重点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5319770/
我希望我在正确的轨道上吗?该网站位于: http://www.dinewine.com/startbootstrap-agency-1.0.6/index.html 当鼠标悬停在顶部导航时,鼠标悬停背
我正在做一个家庭作业,其中包含 Peterson 的领导者选举算法。我很困惑为什么你需要这样的算法来选择领导者。为什么不随机选择一个?或者队列中的第一个。 任何澄清都会很好,提前致谢 最佳答案 尝试思
我最近尝试执行以下行; string strCmdText; strCmdText = "netstat -np TCP | find " + quote + number + quote + "";
好的,我已经订购了 Applying Domain-Driven Design and Patterns: Using .Net ,但是在我等待它到来的时候,我正在考虑开始在我当前的项目中应用这些技术
我正在尝试使用 jQuery prop() 方法禁用元素(表单字段)。有两个字段,一个叫做fee,一个叫做currency。每当 fee 设置为 0 时,第二个字段 currency 将被禁用。这样做
下面的代码是我用来在我的应用程序中创建 GridView 的代码。但问题是列表选择器的宽度和高度不等于图标的宽度和高度(图 1)。图片 #2 是我想要完成的。 最佳答案 尝试使用 android:li
我是一名优秀的程序员,十分优秀!