我在Effective STL中注意到了
vector是默认情况下应该使用的序列类型.
这是什么意思?似乎忽略效率vector可以做任何事情.
任何人都可以给我一个vector不可行的选择但list必须使用的场景吗?
我有一个向量,包含活动或非活动的项目.我希望此向量的大小对于性能问题保持较小,因此我希望从向量中删除已标记为非活动的项目.我在迭代时尝试这样做,但我收到错误"vector iterators incompatible".
vector<Orb>::iterator i = orbsList.begin();
while(i != orbsList.end()) {
bool isActive = (*i).active;
if(!isActive) {
orbsList.erase(i++);
}
else {
// do something with *i
++i;
}
}
Run Code Online (Sandbox Code Playgroud) 有没有办法减少矢量的容量?
我的代码将值插入到向量中(事先不知道它们的数字),当这完成时,向量仅用于读取操作.
我想我可以创建一个新的向量,用大小做一个.reseve()并复制项目,但我真的不喜欢额外的复制操作.
PS:我不关心便携式解决方案,只要它适用于gcc.
vector <weight> decoy;
void clear_decoy() {
decoy.clear();
vector<weight> (decoy).swap(decoy);
}
Run Code Online (Sandbox Code Playgroud)
在上面的方法中clear_decoy(),请问vector<weight> (decoy).swap(decoy); 是什么意思?
该方法是否清楚decoy?谢谢!
我的地形引擎有问题(使用DirectX).
我正在使用矢量来保存细节块的顶点.当块增加细节时,向量就会增加.
但是,当块减少其细节时,矢量的大小不会缩小.
所以,我的问题是:有没有办法缩小向量的大小?我试过这个:
vertexvector.reserve(16);
Run Code Online (Sandbox Code Playgroud) 我正在我的应用程序中输入一个200mb的文件,由于一个非常奇怪的原因,我的应用程序的内存使用量超过600mb.我尝试过vector和deque,以及std :: string和char*但没有用.我需要我的应用程序的内存使用与我正在阅读的文件几乎相同,任何建议都将非常有用.是否有导致如此多内存消耗的错误?你能指出问题还是重写整个问题?
Windows Vista SP1 x64,Microsoft Visual Studio 2008 SP1,32位版本,Intel CPU
整个申请到现在为止:
#include <string>
#include <vector>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <time.h>
static unsigned int getFileSize (const char *filename)
{
std::ifstream fs;
fs.open (filename, std::ios::binary);
fs.seekg(0, std::ios::beg);
const std::ios::pos_type start_pos = fs.tellg();
fs.seekg(0, std::ios::end);
const std::ios::pos_type end_pos = fs.tellg();
const unsigned int ret_filesize (static_cast<unsigned int>(end_pos - start_pos));
fs.close();
return ret_filesize;
}
void str2Vec (std::string &str, std::vector<std::string> &vec)
{
int newlineLastIndex(0);
for …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码段:
std::vector<int> v;
v.reserve(100);
v.insert(v.end(), 100, 5);
v.erase(v.begin(), v.end());
std::cout << v.capacity << std::endl;
Run Code Online (Sandbox Code Playgroud)
打印出来100.这是否意味着向量仍然保留了100个内存位置?是否需要reserve(0)在调用erase(begin,end)向量后调用,以放弃向量所持有的所有空间?
当我调用vector<double>::clear()一些大尺寸的矢量时,我看不到内存在任务管理器/性能中返回到系统.
显然这是因为容器希望你再次使用相同的内存.一旦任务完成,我将不会再次使用该内存,并且内存将更好地返回到系统.
有没有一种方法,以确保立即内存返回到系统,比其他使用类似指针vector<double> * v/调用delete上v,当我们想要的记忆又回到了这个系统?
可能重复:
如何缩小std :: vector的大小?
似乎std::vector即使我打电话也不会释放记忆pop_back(),clear()或者resize().
有什么好方法可以解决这个问题吗?例如,在以下代码中:
#include<vector>
??
using namespace std;
??
int main(){
int i, j;
vector<int> v[10000];
for( i=0 ; i<10000 ; i++ ){
for( j=0 ; j<100000000 ; j++ ){
v[i].push_back(j);
}
while(v[i].size()>0){
v[i].pop_back();
}
v[i].resize(1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
向量在完成之前不会释放任何内存.
我在我的程序中定义了一个向量,如下所示:
vector<bool> isPrime (limit + 1, false);
Run Code Online (Sandbox Code Playgroud)
限制是一个int.稍后在程序中,我想回收矢量,保留名称但减小大小并填充所有元素false.
我试过用了
vector<bool> isPrime (otherLimit + 1, false);
Run Code Online (Sandbox Code Playgroud)
以同样的方式重新定义一个int,char或者string,但是,它返回一个错误,因为我没有用new运算符实例化它,我不能delete用旧的.我已经能够手动调整它并使用for循环将每个元素转换为false ,但这对我来说似乎相当笨拙.
是否有更简单的方法来回收矢量?我的愿望是为了可读性目的,始终保持名称相同.