是否在std :: string以外的任何其他标准库容器中使用?

时间:2018-02-07 17:03:06

标签: c++ c++11 stl c++14

SSO(小/短字符串优化)可用于std::string。但它是否允许在其他标准库容器中使用(例如std::vector)?答案取决于容器的模板参数是内置类型还是用户定义类型?

1 个答案:

答案 0 :(得分:9)

更广泛的术语是SBO - 小缓冲区优化。 SSO是字符串特定的。

无论如何,由于迭代器失效规则,标准库中的大多数其他容器都无法使用SBO。该标准保证进入容器的迭代器通过移动保持有效。那就是:

std::vector<T> v = ...;
auto iter = v.begin(); // assume v is non-empty
std::vector<T> new_v = std::move(v);
foo(*iter); // *must* be okay

此保证无法与SBO见面 - 因为iter可能指向vs的自动存储,而new_v无法神奇地转移到std::stringstd::function<>没有这种保证,所以没关系。

另一方面,像$ awk 'BEGIN{FS=OFS=","}($1 in a) && a[$1]!=$2{print $1,a[$1],$2}{a[$1]=$2}' file1 file2 2,mango,man 44,orange,oran 这样的东西(通常会)实现SBO,因为没有这样的移动保证。这不是容器意义上的容器。