我知道向量的大小,这是初始化它的最佳程序?:
选项1
vector<int> vec(3); //in .h
vec.at(0)=var1; //in .cpp
vec.at(1)=var2; //in .cpp
vec.at(2)=var3; //in .cpp
Run Code Online (Sandbox Code Playgroud)
选项2
vector<int> vec; //in .h
vec.reserve(3); //in .cpp
vec.push_back(var1); //in .cpp
vec.push_back(var2); //in .cpp
vec.push_back(var3); //in .cpp
Run Code Online (Sandbox Code Playgroud)
我猜选项2优于1.是吗?其他选择?
我根本不理解错误输出,我写了一个生成它的类.
UserQueues.h
#ifndef USERQUEUES_H
#define USERQUEUES_H
#include <deque>
#include <vector>
#include <memory>
#include "Job.h"
class UserQueues
{
public:
typedef std::unique_ptr<Job> JobPtr;
typedef std::deque<JobPtr> JobDeque;
public:
UserQueues();
void printDeques();
void addToDeque(JobPtr job, int queueId);
public:
const uint QUEUE_QTY = 3;
private:
std::vector<JobDeque> _jobDeques;
};
#endif
Run Code Online (Sandbox Code Playgroud)
UserQueues.cpp
#include <iostream>
#include "UserQueues.h"
UserQueues::UserQueues() :
_jobDeques()
{
for(unsigned int idx = 0 ; idx < QUEUE_QTY ; ++idx)
{
_jobDeques.push_back(JobDeque());
}
}
void UserQueues::printDeques()
{
for (std::size_t idx = 0; idx < _jobDeques.size(); ++idx) …Run Code Online (Sandbox Code Playgroud) 有人可以对这两个术语提供更清晰的解释吗?
换句话说,请举例说明一些简单的解释.
(来自:cppreference.com)
MoveInsertable:指定可以在未初始化的存储中复制该类型的右值.
CopyInsertable:指定可以在未初始化的存储中就地复制构造类型的实例.
遵循这个答案和这个移动构造函数规范,应该没有隐式移动构造函数或移动赋值运算符.
但是,以下代码仍在gcc 7.2.1中编译:
#include <vector>
#include <iostream>
using namespace std;
struct NoCopyNoMove
{
NoCopyNoMove(const NoCopyNoMove&) = delete;
NoCopyNoMove& operator=(const NoCopyNoMove&) = delete;
NoCopyNoMove(NoCopyNoMove&&) = delete;
NoCopyNoMove& operator=(NoCopyNoMove&&) = delete;
NoCopyNoMove(int){};
};
struct NoCopy
{
NoCopy(const NoCopyNoMove&) = delete;
NoCopy& operator=(const NoCopyNoMove&) = delete;
// NoCopy(NoCopy&&) = delete;
// NoCopy& operator=(NoCopy&&) = delete;
~NoCopy() {
std::cout << "decontructor" << std::endl;
}
NoCopy(int){};
};
int main()
{
// vector<NoCopyNoMove> y; // fails!
vector<NoCopy> y;
y.emplace_back(1);
y.emplace_back(2);
}
Run Code Online (Sandbox Code Playgroud)