c++ - std::vector 中包含的类中的 STL 字符串成员

标签 c++ string vector stl

我有一个带有 STL std::string 的 C++ 类 Foo作为成员(member)。此外,我还有一个 STL std::vector<Foo> vecFoo按值包含 Foo 类的对象(不是指向 Foo 的对象的指针)。现在一个 friend 建议我不要以这种方式实现它,而是用指针构建 vector :std::vector<Foo*>或使用升压智能指针。他讨论了一个 vector ,它涉及对其成员的大量复制操作(在添加成员时分配更多空间等),当包含的类具有动态成员时会出现问题,如 std::string。 .会不会出现什么问题?

据我了解std::string当类 Foo 可能被 std::vector 复制时,实际上会进行深度复制(或写时复制) ,因为 Foo 为其所有成员调用复制构造函数。我的 friend 争辩说,当 vector 分配新空间时,如果 vector 中所有 Foo 对象的字符串成员长度不同,这是一个问题。你怎么看?

使用指向 Foo 的指针的唯一原因 vector 内部是速度。指向 Foo (Foo*) 的指针比完整类 Foo 的复制速度快得多,不是吗? 感谢讨论!

最佳答案

我想,如果您要使用 new 分配每个元素对象,带有指针的 std::vector 根本不会更有效率。但是,如果您的元素对象足够大(不是因为字符串长度,而是因为它的“非指针”成员),带指针的 vector 可以或不表现更好——这取决于 vector 重新分配频率。

考虑 std::vector 分配空间很少的事实,因为它分配的空间总是比之前分配的空间多两倍。

C++11 的情况甚至更好,其中 std::vector 将使用 move semantics以避免肯定复制字符串的字符。但是如果你的编译器不生成 default move constructor,你可能需要在你的类中实现移动构造函数才能让这个东西工作。 .

甚至在 C++11 之前,一些 std::string 实现就使用了写时复制策略,因此仅对字符串进行“深度复制”不需要复制底层字符数组,除非其中之一拷贝已修改。

it is a problem if the string members are of different length among all Foo objects in the vector

这肯定不是问题 - std::string 对象,当然,在内部持有指向字符数组的指针,而不是数组本身。

我敢肯定,在做出这种级别的优化决策之前,您应该使用探查器分析您的程序

关于c++ - std::vector 中包含的类中的 STL 字符串成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19704323/

相关文章:

c++ - 通过C++将数据库表中的记录复制到其他数据库的同名表中

c++ - 如何从其他结构访问 protected 结构变量

c++ - 无法访问成对 vector 中的值

c++ - 是否有一种简单直接的方法将音频用作程序的输出?

c++ - 如何使用 double 据类型从 C++ 中的 50.5e-12 中减去 50e-12?

string - 如何用 R 中的字符串替换数据框中的值?

string - "line feed"和 "carriage return"之间有什么区别?

python - 在 Python 中对字符串使用 .format 时出现 KeyError

C++ std::vector emplace vs insert

c++ - 在 Objective-C 中使用 C++ 类 - 为什么使用 PImpl 习惯用法?