使用自己的迭代器分配容器是否安全?


10

举个例子:

string s = "123";
s.assign(find(s.begin(),s.end(),'2'), s.end());

是否定义了上述代码的行为?还是导致不确定的行为?

Answers:


5

是。此版本的assign 定义

template<class InputIterator>
  constexpr basic_string& assign(InputIterator first, InputIterator last);

约束条件:InputIterator是一种有资格作为输入迭代器的类型。

效果:等效于:return Assign(basic_string(first,last,get_allocator()));

它显示了在更改发生之前计算的临时值。


“等于”并不意味着必须创建实际的临时文件。但是,语义必须相同。并且由于所示版本可以安全地进行自我分配,因此实际实施也必须如此。
MSalters,

@MSalters。同意 我打算对此发表评论,然后在尝试确定可以减少多少分配器使用时迷失了方向。
AProgrammer

请注意,这特定于字符串。例如,对于矢量,它将是UB。
TC

@TC,您能引用标准吗?
阿德勒

1
@Adler,见该表到的矢量描述参照。
AProgrammer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.