当我运行我的程序时,它偶尔会崩溃并给我这个错误:" 检测到glibc/pathtoexecutable:free():下一个大小无效(快)"
回溯导致成员函数只调用向量的push_back函数 -
void Path::add(Position p) {path.push_back(p);}
Run Code Online (Sandbox Code Playgroud)
我试过谷歌搜索错误,而绝大多数问题是人们分配的内存太少.但是怎么可能在std :: vector <>.push_back上发生?我可以检查什么?任何帮助表示赞赏.
我让我的循环遍历vector的元素.在这个循环中,一些元素正在被删除(我希望它们被删除).虽然std :: vector不允许这样做,但我想要一个替代方案.
for(unsigned int j = 0; j < rectArray.size(); j++)
{
if( rectArray[j] == 2 )
{
rectArray.erase(rectArray.begin() + j);
}
//...
}
Run Code Online (Sandbox Code Playgroud)
你觉得std :: list在这里会好吗?我可以用别的东西吗?
我使用的priority_queue<unsigned long,vector<unsigned long>,greater<unsigned long> >是C++,内存限制为16MB.我的程序只需要10MB,但一旦达到8653464字节,它会尝试将其容量加倍并抛出一个bad_alloc.
有没有办法使用我当前的实现来阻止这个?可以在priority_queue具有数(n)时间仍然如果我切换到deque[从vector]
我std::vector用来在Image类中存储图像.我理解他们的工作方式有点麻烦.旋转图像的功能:
void Image :: resize (int width, int height)
{
//the image in the object is "image"
std::vector<uint8_t> vec; //new vector to store rotated image
// rotate "image" and store in "vec"
image = vec; // copy "vec" to "image" (right?)
//vec destructs itself on going out of scope
}
Run Code Online (Sandbox Code Playgroud)
有没有办法阻止最后一个副本?就像在Java中一样,只需切换引用?如果防止任何复制将是很好的.
我想使用std::remove_if谓词,这是一个不同的calss的成员函数.
那是
class B;
class A {
bool invalidB( const B& b ) const; // use members of class A to verify that B is invalid
void someMethod() ;
};
Run Code Online (Sandbox Code Playgroud)
现在,实施A::someMethod,我有
void A::someMethod() {
std::vector< B > vectorB;
// filling it with elements
// I want to remove_if from vectorB based on predicate A::invalidB
std::remove_if( vectorB.begin(), vectorB.end(), invalidB )
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我已经研究了用于remove_if的Idiomatic C++的解决方案
,但是它处理的是一个稍微不同的情况,其中一元谓词remove_if是成员B而不是成员A.
而且,
我无法访问BOOST或c …
在我的C ++项目中,我有一个Engine类和一个Object类。
我的问题在于如何Object创建实例。当前,这是通过使用类中的CreateObject(parameters)函数来完成的Engine。这增加的新实例Object到std::vector的Object实例。
我想维护此类Object在我的Engine类中的实例列表,但不需要此CreateObject(parameters)功能。我这样做的原因是,我可以创建可以继承Object但仍添加到此列表的新类。使用此列表的原因是为了使(Engine可以)我可以遍历Object已创建的每个实例。
最终这将意味着我Object用类似的实例创建实例Object newObject = Object(parameters);,但仍使Engine该类维护所有Object实例的列表,而无需Object引用的实例Engine或将其自身添加到此列表的列表(如Objectshould 的实例)不知道它所在的列表)。 能做到吗?
我正在使用dirent从特定文件夹中读取文件名,我想将名称保存在char*向量中.它似乎是复制一些奇怪的符号而不是复制文件名.这是我到目前为止所尝试的:
std::vector<char*> filenames;
int filenamesAndNumberOfFiles(char *dir)
{
struct dirent *dp;
DIR *fd;
int count = 0;
if ((fd = opendir(dir)) == NULL)
{
fprintf(stderr, "listdir: can't open %s\n", dir);
return 0;
}
while ((dp = readdir(fd)) != NULL)
{
if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
continue; /* skip self and parent */
printf("Filename: %s\n", dp->d_name);
filenames.push_back(dp->d_name);
count++;
}
closedir(fd);
return count;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么它不复制文件名,我怎么能复制它们?
编辑: d_name是一个char变量,声明为:
char d_name[PATH_MAX];
Run Code Online (Sandbox Code Playgroud)
似乎在我的程序中,PATH_MAX等于260.
PS:这是我第一次使用dirent,所以我对它并不熟悉.
我有一个unordered_set存储以下结构的
struct match_t{
size_t score;
size_t ci;
};
typedef std::unordered_set<match_t> uniq_t;
Run Code Online (Sandbox Code Playgroud)
现在,我想将的元素存储uniq_t myset;到向量中,但是这样做时,我只想复制分数而不是整个struct。我已经看到了使用assign或分配元素的解决方案back_inserter。我想知道如何从结构中选择所需的字段。我看不到任何参数assign或back_inserter为此目的。
我应该push_back为向量尝试覆盖方法还是执行其他方法?
编辑1 我是否可以通过使用这些方法中的任何一种而不是循环遍历集合并分配所需的值来提高性能?
考虑以下:
#include <memory>
#include <utility>
#include <vector>
class Base
{
public:
Base()
: x(0)
{}
int x;
virtual ~Base() = default;
};
class Derived : public Base
{
public:
Derived(double z0)
: Base{}
, z{ z0 }
{}
double z;
};
template<class T> // T might be either a Base or a Derived class.
std::vector<std::shared_ptr<Base>> MakeVector(std::size_t numElements)
{
std::vector<std::shared_ptr<Base>> vec;
for(auto &i : numElements) { // Compiler error occurs here.
vec.push_back(std::make_shared<T>());
}
return vec;
}
class Foo
{
public:
Foo(std::size_t …Run Code Online (Sandbox Code Playgroud) 我有一个整数向量,可以说{1, 2, 3, 4}。
如何10为每个元素添加常量值以将向量修改为{11, 12, 13, 14}。
如果我想将每个元素都除以an int并修改向量,则与除法相同。我一直找不到解决方案。