我的C++应用程序中有一个缓冲类,如下所示:
class Buffer
{
public:
Buffer(size_t res): _rpos(0), _wpos(0)
{
_storage.reserve(res);
}
protected:
size_t _rpos, _wpos;
std::vector<uint8> _storage;
}
Run Code Online (Sandbox Code Playgroud)
有时使用构造函数失败,因为它无法分配所需的内存空间.例如,一次调用构造函数res = 37导致了一个段错误,其中包含我从其核心转储获得的以下堆栈跟踪:
#0 0x00007f916a176ed5 in raise () from /lib/libc.so.6
No symbol table info available.
#1 0x00007f916a1783f3 in abort () from /lib/libc.so.6
No symbol table info available.
#2 0x00007f916a1b33a8 in ?? () from /lib/libc.so.6
No symbol table info available.
#3 0x00007f916a1b8948 in ?? () from /lib/libc.so.6
No symbol table info available.
#4 0x00007f916a1bb17c in ?? () from /lib/libc.so.6
No …Run Code Online (Sandbox Code Playgroud) 我最近在以下函数中修复了一个错误,答案让我感到惊讶.我有以下功能(在我发现错误之前编写):
void Level::getItemsAt(vector<item::Item>& vect, const Point& pt)
{
vector<itemPtr>::iterator it; // itemPtr is a typedef for a std::tr1::shared_ptr<item::Item>
for(it=items.begin(); it!=items.end(); ++it)
{
if((*it)->getPosition() == pt)
{
item::Item item(**it);
items.erase(it);
vect.push_back(item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
此函数查找Item"项目"向量中具有特定位置的所有对象,将其从"项目"中删除,并将它们放在"vect"中.之后,名为的函数putItemsAt执行相反的操作,并将项添加到"项".第一次通过,getItemsAt工作正常.putItemsAt但是,在调用之后,for循环getItemsAt将在'items'结束时运行.'它'将指向无效Item指针和段错误getPosition().在预感中,我改变it!=items.end()了it<items.end(),并且它起作用了.谁能告诉我为什么?环顾SO表明它可能涉及erase使迭代器无效,但它仍然没有意义,为什么它会第一次工作.
我也很好奇,因为我计划将"项目"从向量更改为列表,因为列表的擦除效率更高.我知道我必须使用!=列表,因为它没有<运算符.我会使用列表遇到同样的问题吗?
我见过我的同事经常做第二个片段.为什么是这样?我已经尝试添加打印语句来跟踪ctors和dtors,但两者看起来都相同.
std::vector<ClassTest> vecClass1;
ClassTest ct1;
ct1.blah = blah // set some stuff
...
vecClass1.push_back(ct1);
Run Code Online (Sandbox Code Playgroud)
std::vector<ClassTest> vecClass2;
vecClass2.push_back(ClassTest());
ClassTest& ct2 = vecClass2.back();
ct2.blah = blah // set some stuff
...
Run Code Online (Sandbox Code Playgroud)
PS.如果标题有误导性,我很抱歉.
编辑:
首先,谢谢大家的回复.
我用了一个小应用程序std::move.结果让我感到惊讶,也许是因为我做错了...有人请解释为什么"快速"路径表现得更好.
#include <vector>
#include <string>
#include <boost/progress.hpp>
#include <iostream>
const std::size_t SIZE = 10*100*100*100;
//const std::size_t SIZE = 1;
const bool log = (SIZE == 1);
struct SomeType {
std::string who;
std::string bio;
SomeType() {
if (log) std::cout << "SomeType()" << std::endl;
}
SomeType(const SomeType& other) …Run Code Online (Sandbox Code Playgroud) 我有一个字符串
std::string s = "Stack Overflow";
Run Code Online (Sandbox Code Playgroud)
我需要复制到矢量中.这就是我这样做的方式
std::vector<char> v;
v.reserve(s.length()+1);
for(std::string::const_iterator it = s.begin(); it != s.end(); ++it)
{
v.push_back( *it );
}
v.push_back( '\0' );
Run Code Online (Sandbox Code Playgroud)
但我听说范围操作更有效率.所以我在想这样的事情
std::vector<char> v( s.begin(), s.end());
v.push_back('\0');
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,这样做会更好吗?插入'\ 0'时潜在的重新分配怎么样?
我想的另一种方法就是这样
std::vector<char> v(s.length()+1);
std::strcpy(&v[0],s.c_str());
Run Code Online (Sandbox Code Playgroud)
也许速度快但可能不安全?
编辑
必须是一个空终止字符串,可以在C函数内使用(读/写)
我仍然对std::vector在C++ 11中使用的类型的要求感到困惑,但这可能是由错误的编译器(gcc 4.7.0)引起的.这段代码:
struct A {
A() : X(0) { std::cerr<<" A::A(); this="<<this<<'\n'; }
int X;
};
int main()
{
std::vector<A> a;
a.resize(4);
}
Run Code Online (Sandbox Code Playgroud)
工作正常并产生预期的输出,表明默认的ctor(显式给定)被调用(而不是隐式复制ctor).但是,如果我将删除的副本ctor添加到课程中,即
struct A {
A() : X(0) { std::cerr<<" A::A(); this="<<this<<'\n'; }
A(A const&) = delete;
int X;
};
Run Code Online (Sandbox Code Playgroud)
gcc 4.7.0不编译,但尝试使用已删除的ctor.这是正确的行为还是错误?如果是前者,如何让代码工作?
我正在尝试加载一个对象并使用VBO和glDrawArrays()来渲染它.问题是像float f[]={...}我这样的简单浮点指针不起作用,因为我传递了这个指针可以存储的值的限制.所以我的解决方案是使用矢量.而且它不起作用......
这是我的代码:
unsigned int vbo;
vector<float*> vert;
...
vert.push_back(new float(i*size));
vert.push_back(new float(height*h));
vert.push_back(new float(j*size));
...
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vert), &vert, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
并呈现:
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
我glBufferData()对第3个参数的位置有问题const GLvoid *data.我正在路过,&vert但它没有用.
我有这段代码:
for (std::vector<Marker>::iterator it = markers.begin(); it != markers.end(); ++it) {
if (it->getDots().size() < 3) {
markers.erase(it);
}
}
Run Code Online (Sandbox Code Playgroud)
在其中一个测试输入(应用程序进行图像分析)中,我得到了一个段错误.我试图调试代码(无济于事)并注意到一件事.当问gdb p markers.size()我收到$9 = 3.所以我希望循环迭代三次,但令人惊讶的是它(至少)完成了5次.在第五次迭代中有一个段错误.我还注意到,导致错误的不是*it(这里it->)的解引用.具体来说it->getDots(),这是一个简单的吸气剂.
我很少用C++编写,所以它可能是一个简单的错误,但我的调试和谷歌搜索都没有带来任何解决方案.你能帮忙吗?
我想强调的是,在各种不同的输入(略有不同的图像)上,这个功能正常工作,所以我更难以追踪到这个错误.
我有一些代码将各种元素组合到缓冲区中.我的代码看起来像这样:
static void CreatePacket(const std::string& source, const std::string id, const std::string payload, std::vector<char>& buffer)
{
buffer.resize(source.size() + id.size() + payload.size());
std::vector<char>::iterator bufferDest = buffer.begin();
// Start the message
char MessageStart = '$';
*bufferDest = MessageStart;
++bufferDest;
// Copy the message source
std::copy(source.begin(), source.end(), bufferDest);
bufferDest += source.size();
// Copy the message id
std::copy(id.begin(), id.end(), bufferDest);
bufferDest += id.size();
}
Run Code Online (Sandbox Code Playgroud)
该方法调用如下:
std::vector<char> buffer;
std::string source = "AB";
std::string id = "CDE";
std::string payload = "payload";
CreatePacket(source, id, payload, buffer);
Run Code Online (Sandbox Code Playgroud)
在std …
我希望将矢量迭代器作为c ++中类定义的一部分,并希望将它们初始化为固定的默认值.在指针的情况下,我会初始化为NULL,不知道应该为vector迭代器做什么.
class ball{
private:
double x;
double v;
double timeToNext;
vector<ball>::iterator lball, rball;//How should they be initialized?
public:
ball() { //default constructor
x=-1*INF;
v=0;
cout<<"Ball added"<<endl;
//want to initialize iterators
}
void setx(double &pos){x=pos;}
void setv(double &vel){v=vel;}
void setTimeToNext() {
double tl, tr;
}
double getx(){return x;}
double getv(){return v;}
};
Run Code Online (Sandbox Code Playgroud) 我想计算大于c ++向量中元素个数的元素。阈值将从用户输入。
用于计数大于数字的元素的代码为:
ctr=count_if(v.begin(),v.end(), greater1);
对应功能:
bool greater1(int value)
{
return value >= 8;
}
Run Code Online (Sandbox Code Playgroud)
问题是我仅在count_if函数调用之前才知道阈值(此处为8),因此我需要将阈值t作为参数传递。如何建立相同的?