【发布时间】:2018-10-31 13:02:21
【问题描述】:
问题:
假设我有一个字符串,我想生成一个新字符串,其中包含原始字符串及其反向连接。
以下内容是否保证有效?
auto pq = [](std::string &s){
s.reserve(2*s.size());
s.append(s.rbegin(), s.rend());
};
我看到reserve 应该适当地设置capacity。但是,对反向迭代器应用append 会导致这些迭代器失效吗?
附加背景:
我的 C++.11 副本(与 C++.17 draft 具有相同的语言),在 §[string.capacity]
中说
void reserve(size_type res_arg=0);
- 成员函数
reserve()是一个指令,它通知basic_string对象计划的更改 大小,以便它可以相应地管理存储分配。- 效果:
reserve()之后,capacity()大于等于reserve的参数。 [ 注意: 调用reserve()的res_arg参数小于capacity()实际上是一个非绑定收缩请求。 与res_arg <= size()的调用实际上是一个不具约束力的缩小以适应的请求。 — 结束说明 ]i>- 抛出: 如果
res_arg > max_size().227,则为 length_error
227) reserve() 使用 allocator_traits::allocate() 可能会引发适当的异常。
虽然,§[string.append] 说
basic_string&append(const charT* s, size_type n);
- 要求:
s指向至少包含n元素的charT的数组。- 抛出:
length_errorifsize() + n > max_size().- 效果:函数将
*this控制的字符串替换为长度为size() + n的字符串 其第一个size()元素是由*this控制的原始字符串的副本,其剩余 元素是s的初始n元素的副本。- 返回:
*this。
【问题讨论】:
-
我很确定,只要容量足够大,迭代器在附加到字符串时不会失效,并且这将扩展到反向迭代器;如果我是对的,这段代码将生成一个回文。但我绝对不确定。
标签: c++ string iterator language-lawyer