我想通过从流中读取单个元素来创建一些复杂类型的向量.我事先知道矢量大小.是否更好地指定向量构造函数中的元素数量或使用reserve方法?这两个中哪一个更好?
int myElementCount = stream.ReadInt();
vector<MyElement> myVector(myElementCount);
for (int i = 0; i < myElementCount; i++)
{
myVector[i] = stream.ReadMyElement();
}
Run Code Online (Sandbox Code Playgroud)
要么
int myElementCount = stream.ReadInt();
vector<MyElement> myVector;
myVector.reserve(myElementCount);
for (int i = 0; i < myElementCount; i++)
{
myVector.push_back(stream.ReadMyElement());
}
Run Code Online (Sandbox Code Playgroud)
那么我只是创建一个int或其他简单类型的向量的情况呢.
我将大部分类分为两个文件(.h 和 .cpp)。它们的所有方法(公共、私有或受保护)都在 .h 文件中声明并在 .cpp 文件中定义。
但是,有时我只需要一个仅由其中一个成员方法使用的快速辅助方法。在这些情况下,是否可以在 .cpp 文件中将此方法声明/定义为非成员函数,而不在 .h 文件中声明它?
这种方法可能有哪些缺点?我看到的是,该方法的定义必须出现在 .cpp 文件中的使用之前(如果我们不想使用前向声明)。此外,如果这些函数完全位于 .cpp 文件中,IDE 可能会很难找到这些函数。
我问这个问题的原因是,有时感觉就像我用这些不访问成员数据且不被任何其他类/文件使用的方法的声明污染了 .h 文件。看起来我通过引入这些辅助方法声明使 .h 文件中真正重要的声明更难查找/读取。
我有一个场景,我需要将原始动态分配的uint8_t数组的内容复制到一个向量中(无论何时发生这种情况,都保证为空).
vector<uint8_t> myVector;
const uint8_t* myRawArray;
Run Code Online (Sandbox Code Playgroud)
对我来说非常重要的是复制操作尽可能高效且可移植(可能会使用各种编译器版本).
我想用的一种方法是这样的:
myVector.reserve(byteCount);
myVector.insert(myVector.begin(), myRawArray, myRawArray + byteCount);
Run Code Online (Sandbox Code Playgroud)
关于速度如何与此相比的任何想法:
myVector.resize(byteCount);
memcpy(myVector.data(), myRawArray, byteCount);
Run Code Online (Sandbox Code Playgroud)
我想memcpy应该很快,但后来我被迫使用resize哪个需要将内存清零,所以我猜它会慢一点......
还有,还有其他建议吗?
我有一堆返回的方法vector<int>.它们不返回引用或指针,vector<int>因为返回的值不是类'state的一部分,它只是根据方法参数动态生成.
我想避免vector<int>在调用这样的方法时调用复制构造函数.
vector<int> result = myClass.GenerateVectorOfInt(/* params */);
// Do something with the result;
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么?
这是否是一种可以接受的方式?或者还有其他更好或更优雅的解决方案.
vector<int> result = std::move(myClass.GenerateVectorOfInt(/* params */));
Run Code Online (Sandbox Code Playgroud)