我相信对此的常见反应是“不”,end()因为容器的迭代器表示“过去结束”地址,这是取消引用的未定义行为。我在标准中找不到一个明确的声明来免除字符串的约束,即使字符串比其他容器有特殊情况。
C++11 标准声明您可以读取超过字符串末尾的一个索引。string[size()]引用空终止符的只读值。
24.3.2.5 basic_string 元素访问 [string.access]
const_reference operator[](size_type pos) const;
reference operator[](size_type pos);(1)要求:
pos <= size().(2)回报:
*(begin() + pos) if pos < size()。否则,返回对类型charT为 value的对象的引用charT(),其中将对象修改为除charT()导致未定义行为之外的任何值。
front()被定义为等效于return operator[](0)which 等效return operator[](size())于一个空字符串。
end() - begin()被明确定义为字符串长度的差异,因此end()必须指向的索引size()才能定义该算术。
在上面的标准摘录中,它说明这operator[](pos)等效于*(begin() + pos)if pos < size()。它并不是说您可以取消引用begin() + size(),但您认为假设这应该被明确定义是否合理?或者更好的是,您是否知道一些证明可以将字符串迭代器从约束中排除?
另外,能否证明*(begin() + i)for …
首先,请允许我说,出于明显的原因,我不建议您采用以下任何一种做法。但是,我今天对此进行了讨论,有些人坚持使用像这样的引用作为未定义的行为。
这是一个测试案例:
#include <string>
struct my_object {
int a = 1;
int b = 2;
std::string hi = "hello";
};
// Using union purely to reserve uninitialized memory for a class.
union my_object_storage {
char dummy;
my_object memory;
// C++ will yell at you for doing this without some constructors.
my_object_storage() {}
~my_object_storage() {}
} my_object_storage_instance;
// This is so we can easily access the storage memory through "I"
constexpr my_object &I = my_object_storage_instance.memory;
//-------------------------------------------------------------
int main() {
// Initialize …Run Code Online (Sandbox Code Playgroud) 我是否创建了一个所有 SSL套接字共享的链,或者每个SSL上下文一个链(由任何相关的套接字共享)?
Boost.Asio SSL文档声明了这一点,但它没有提到上下文.我认为这意味着我必须只使用一个链,但我认为这是在OpenSSL支持多线程之前编写的.
SSL和线程
SSL流对象不执行自己的锁定.因此,必须在隐式或显式链中执行所有异步SSL操作.请注意,这意味着在单线程程序中不需要同步(因此不会产生锁定开销).
我很可能只有一个SSL上下文,但我想知道这个链是由SSL上下文还是全局网络服务所拥有的更合适.
我确实提供了一个处理程序CRYPTO_set_locking_callback,以防万一.
我的字符串是"AAABBAABABB",我想得到结果
A = 3
B = 2
A = 2
B = 1
A = 1
B = 2
Run Code Online (Sandbox Code Playgroud)
我试过用
for (int i = 0; i < n - 1; i++) {
if (msg[i] == msg[i + 1]) {
if(msg[i]==A)
a++;
else
b++;
}
}
Run Code Online (Sandbox Code Playgroud)
我试过它对我不起作用。而且我不明白是否还有其他方法可以找到它。请帮帮我。