在每次迭代中创建一个结构
Create a struct in each iteration
我想将队列存储在 stl
库中的队列结构中。由于某些原因,我必须在我的程序的每次迭代中存储一个队列,但我认为一遍又一遍地创建一个新队列太昂贵了。
我只知道两种方法。第一个:
#include <iostream>
#include <deque>
using namespace std;
int main () {
unsigned int limit, i = 0;
deque<deque<int> > container;
cin >> limit;
for ( ; i < limit; i++ ) {
deque<int> values;
//set some values in the values structure.
setValues(values, i);
container.push(values);
}
}
第二个:
#include <iostream>
#include <deque>
using namespace std;
int main () {
unsigned int limit, i = 0;
deque<deque<int> > container;
deque<int> values;
cin >> limit;
for ( ; i < limit; i++ ) {
//reset the structure, i.e. delete al the previous values.
reset(values);
//set some values in the values structure.
setValues(values, i);
container.push(values);
}
}
这里的问题是我不知道有什么函数可以重置我的队列,或者我必须这样做 values=NULL
?
我怎样才能有效地做到这一点?
谢谢! :D
您可以在循环中推送一个空 deque
,获取对它的引用,然后向其中添加项目。
#include <iostream>
#include <deque>
using namespace std;
int main () {
unsigned int limit, i = 0;
deque<deque<int> > container;
cin >> limit;
for ( ; i < limit; i++ ) {
container.push_back(deque<int>());
deque<int>& values = container.back();
//set some values in the values structure.
setValues(values, i); }
}
您应该在调试器中检查编译器在复制双端队列时实际在做什么。我已经按预期检查了 VS2013 及其所有移动语义。这是测试代码:
std::deque<int> getValues() {
std::deque<int> res;
res.push_back(1);
return res; // deque(_Myt&& _Right) called, also other compilers might use RVO
}
std::deque<int> ff;
std::deque<std::deque<int>> aff;
aff.push_back(getValues()); // void push_back(value_type&& _Val) called
乍一看好像是复制了很多,但实际上在两个有问题的地方都使用了移动语义,而且只复制了临时对象的指针,所以速度非常快。
但也许您还处于 C++11 之前的世界?至少这个片段
deque<deque<int> > container;
^^^
给出了这样的提示。
我想将队列存储在 stl
库中的队列结构中。由于某些原因,我必须在我的程序的每次迭代中存储一个队列,但我认为一遍又一遍地创建一个新队列太昂贵了。
我只知道两种方法。第一个:
#include <iostream>
#include <deque>
using namespace std;
int main () {
unsigned int limit, i = 0;
deque<deque<int> > container;
cin >> limit;
for ( ; i < limit; i++ ) {
deque<int> values;
//set some values in the values structure.
setValues(values, i);
container.push(values);
}
}
第二个:
#include <iostream>
#include <deque>
using namespace std;
int main () {
unsigned int limit, i = 0;
deque<deque<int> > container;
deque<int> values;
cin >> limit;
for ( ; i < limit; i++ ) {
//reset the structure, i.e. delete al the previous values.
reset(values);
//set some values in the values structure.
setValues(values, i);
container.push(values);
}
}
这里的问题是我不知道有什么函数可以重置我的队列,或者我必须这样做 values=NULL
?
我怎样才能有效地做到这一点?
谢谢! :D
您可以在循环中推送一个空 deque
,获取对它的引用,然后向其中添加项目。
#include <iostream>
#include <deque>
using namespace std;
int main () {
unsigned int limit, i = 0;
deque<deque<int> > container;
cin >> limit;
for ( ; i < limit; i++ ) {
container.push_back(deque<int>());
deque<int>& values = container.back();
//set some values in the values structure.
setValues(values, i); }
}
您应该在调试器中检查编译器在复制双端队列时实际在做什么。我已经按预期检查了 VS2013 及其所有移动语义。这是测试代码:
std::deque<int> getValues() {
std::deque<int> res;
res.push_back(1);
return res; // deque(_Myt&& _Right) called, also other compilers might use RVO
}
std::deque<int> ff;
std::deque<std::deque<int>> aff;
aff.push_back(getValues()); // void push_back(value_type&& _Val) called
乍一看好像是复制了很多,但实际上在两个有问题的地方都使用了移动语义,而且只复制了临时对象的指针,所以速度非常快。
但也许您还处于 C++11 之前的世界?至少这个片段
deque<deque<int> > container;
^^^
给出了这样的提示。