标签: stdvector

c ++ std vector - 无效的迭代器问题

我有一个标准的指针向量.

在什么情况下,这个向量中的迭代器可能会失效?

我有理由相信,当一个对象被删除时,任何引用它的向量迭代器都会因此失效.然而,这对我来说似乎不正确.我相信这将是Managed .NET中容器的标准行为,但在c ++中这似乎不合适.

for (It = Vec.begin(); It != Vec.end(); It++){
  GoToOtherCode((*It));
}

function GoToOtherCode (ObjectType* Obj){
  delete Obj;
}
Run Code Online (Sandbox Code Playgroud)

这会使Iterator无效吗?在我看来它不应该,但是我遇到了一个难以调试的问题!(我害怕我的解决方法 - 通过整数索引遍历向量.(这很好......我只是害怕上面导致失效问题的原因).

在此先感谢您的时间.

编辑:感谢您的建议.普遍的共识是上述代码是危险的,但它不会使迭代器无效.我相信我在Visual Studio 2008调试器中遇到错误,因为在第二天打开项目后,这个无效的问题就消失了.所以 - 就像计算机中的许多东西一样,如果其他任何东西看起来都不起作用,请尝试重置该东西.

c++ std stdvector

1
推荐指数
1
解决办法
1463
查看次数

类对象传染媒介

我创建了一个类对象的向量.以下程序崩溃了

 "Pointer being freed was not allocated". 
Run Code Online (Sandbox Code Playgroud)

我也有很深的复制.我没有看到双重删除发生在哪里.我错过了什么?

    #include <iostream>
    #include <vector>
    using namespace std;

    enum MessageType { HEADER, DATA, CLOSE};

    typedef class bufferElement{

    public:
        char *buffer ; //The actual data
        int64_t length; //length of the data
        MessageType messagetype;    

        /**
         * Copy constructor for the structure
         */
        bufferElement(const struct bufferElement &toCopy)
        {
            std::cout << "Copying the buffer vector - Copy Constructor for buffer" << std::endl;
            buffer = new char[toCopy.length];
            memcpy(buffer,toCopy.buffer,toCopy.length);
            length = toCopy.length;
            messagetype = toCopy.messagetype;
        }


        bufferElement()
        {
            buffer …
Run Code Online (Sandbox Code Playgroud)

c++ destructor stl class stdvector

1
推荐指数
1
解决办法
715
查看次数

std :: vector(或其他地方)中最奇怪的bug(或其他东西).这是怎么回事?

我尝试使用Visual Studio 2012 RC和英特尔C++编译器XE 12.1进行编译.如果您尝试使用其他编译器,我将不胜感激.在代码中查看我的评论,真正体会到这个bug的奇怪之处.有谁知道发生了什么,我应该在哪里提交有关此问题的错误报告?

// File: NamedSameA.h

#pragma once
Run Code Online (Sandbox Code Playgroud)
// File: NamedSameA.cpp

#include <vector>

#include "NamedSameA.h"

struct NamedSame // Rename this class to something else to make the program work
{
    std::vector<int> data;
    // Comment out the previous line or change
    // the data type to int to make the program work
};

static NamedSame g_data; // Comment out this line to make the program work
Run Code Online (Sandbox Code Playgroud)
// File: NamedSameB.h

#pragma once

void test();
Run Code Online (Sandbox Code Playgroud)
// File: NamedSameB.cpp

#include <vector>

#include …
Run Code Online (Sandbox Code Playgroud)

c++ bug-tracking vector stdvector

1
推荐指数
1
解决办法
1289
查看次数

访问std :: vector元素会随着矢量大小而减慢

今天我遇到了一个问题,访问矢量元素减慢了矢量的大小.由于这不是我的代码,我无法发布,所以请耐心等待.我将尝试尽可能详细地描述它.

代码的功能如下:1.数据集类,采用.txt文件,其中包含文件名.这些指向需要加载的标准png图像.这是由一个Image<T>班级完成的.图像被加载Image<unsigned char>并推回到std::Vector.2.完成数据加载后.我可以访问我的数据集中的向量,以便使用它.所以它看起来像这样:

Dataset d;
d.init("filenames_list.txt"); //Loads the images
for(int i=0; i< d.getDatavector().size(); i++){
  Image<unsigned char> current = d.getDatavector()[i];
  //Do work on current image here.
}
Run Code Online (Sandbox Code Playgroud)

这里getDatavector()将返回一个std::Vector<Image<unsigned char> >.对于宽度,高度和通道数,图像保持三个整数,并且还包含指向交错数据的Boost共享指针.

对于小型测试,我有一个包含大约150个图像的文件列表.使用此程序运行程序工作正常,速度测量告诉我

Image<unsigned char> current = d.getDatavector()[i];

大约需要10毫秒才能完成.但是,如果我想处理1500张图像的完整数据集,则上述行需要大约500毫秒才能完成.我试图做很多不同的事来解决它,但我受到代码的一般结构和内存的限制.因为如果我做以下事情:

const std::Vector<Image<unsigned char> > data = d.getDatavector();

在循环之前,它运行得非常快,但我很快就会耗尽内存.

我知道我的问题描述有点模糊,我不希望得到确切的解决方案,但我希望有一些关于在哪里寻找的提示.我搜索了类似的问题,但人们似乎只关心向量与数组的一般速度.我的问题是,速度会随着矢量的长度而降低!如果有人看到过这种问题,我们非常欢迎任何建议!

到目前为止,我尝试使用std :: vector :: iterator或使用(d.getDatavector().data())作为指针来访问内容.似乎没有什么能提高它的速度.

c++ performance stl stdvector

1
推荐指数
2
解决办法
315
查看次数

无法调整c ++ std :: vector的大小,它是类的成员变量

代码(简化版)

(部分)类定义:

struct foo {
    std::vector<int> data;
    foo(int a=0):data(a+1,0) {}
    void resize(int a) {
        data.resize(a+1,0);
    }
}
Run Code Online (Sandbox Code Playgroud)

这a+1部分是因为我想要data1索引来简化一些操作.

在全球范围内:

int k;
foo bar;
Run Code Online (Sandbox Code Playgroud)

在main功能:

std::cin>>k;
bar.resize(k);
Run Code Online (Sandbox Code Playgroud)

稍后在main函数中,调用另一个成员函数(in foo)访问data,导致a segmentation fault(segsegv).

调试后,我发现data.size()返回0.这是非常意外的.

调试的很长的会议结束后,我感到非常有信心,这个问题是与resizeING,这应该不会造成任何问题(这是从标准库,毕竟!).

PS不要指责我将任何东西放在全球范围内或让公众可以访问集体成员.我不是在写任何"真正的"程序,因为我只是在参加编程比赛.

c++ vector segmentation-fault stdvector c++-standard-library

1
推荐指数
1
解决办法
1067
查看次数

什么是将地图的键集转换为键向量的有效方法

什么是将map的键集转换为键的向量的有效方法,目前我正在迭代我的地图并将iter.first添加到vector中,这类似于Java的KeySet api?

c++ stdmap std stdvector

1
推荐指数
1
解决办法
117
查看次数

使用VC++ 6中的向量进行数组排序时出错,而VC++ 2012中没有错误

我在VC++ 2012中使用此行代码对称为arrayCosts的集成行数组进行排序.此代码适用于此版本,但不适用于VC++ 6版本.

vector< vector<float> > my_vector ;
for( const auto& row : arrayCosts ) my_vector.push_back( vector<float>( begin(row), end(row) ) ) ;
        sort( begin(my_vector), end(my_vector),
                    []( const vector<float>& a, const vector<float>& b ) { return a[1] < b[1] ; } ) ;   
Run Code Online (Sandbox Code Playgroud)

VC++ 6中的错误如下.

e:\logistics\projects\10\10\source1.cpp(190) : error C2143: syntax error : missing ',' before ':'
e:\logistics\projects\10\10\source1.cpp(190) : error C2530: 'row' : references must be initialized
e:\logistics\projects\10\10\source1.cpp(190) : error C2059: syntax error : ':'
e:\logistics\projects\10\10\source1.cpp(191) : error C2065: 'begin' : undeclared …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++-6 stdvector c++11

1
推荐指数
1
解决办法
210
查看次数

在使用operator =?分配之前需要调用std :: vector.clear()

我最近用Visual Leak Detector首次对我的代码进行了描述,它表明了一个向量中的泄漏,这是我没想到的.代码是这样的:

void func()
{
    std::vector<MsgUnit> msgVec;

    do
    {
        // msgVec.clear(); // do I need to do this to avoid a leak?
        msgVec = m_obj->returnMsgUnitVector();
    }
    while (someConditionNotMet);

    // process msgVec

    return;
}
Run Code Online (Sandbox Code Playgroud)

MsgUnit 有一个复制构造函数和析构函数.

我没有时间进行深入测试,但快速修复似乎表明取消注释该clear()方法可以消除泄漏.

我想知道关于这种行为的标准是什么.在分配之前我是否需要清除矢量,以避免泄漏?

c++ memory-leaks vector stdvector

1
推荐指数
1
解决办法
1721
查看次数

干净的方式以相反的顺序访问std :: vector元素?

在Python中,访问数组的[-1]第th个元素会给出最后一个元素,并[-2]为倒数第二个元素编制索引.

在C++中是否有类似的漂亮语法std::vector以相反的顺序访问元素?

c++ stdvector

1
推荐指数
1
解决办法
1034
查看次数

不能std :: shuffle?

代码是基本的:

#include <iostream>
#include <vector>
#include <random>
#include <chrono>
#include <algorithm>

int main(int argc, const char *argv[]) {
    std::vector<int> mSet = { 1, 2, 3, 4 };

    auto timeSeed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
    std::seed_seq ss{ uint32_t(timeSeed & 0xffffffff), uint32_t(timeSeed >> 32) };
    std::mt19937_64 rng;
    std::shuffle(mSet.begin(), mSet.end(), rng);

    for (size_t i = 0; i < mSet.size(); i++) {
        std::cout << mSet[i] << " ";
    }
}
Run Code Online (Sandbox Code Playgroud)

它总是向我显示相同的序列.我哪里错了?

c++ random stdvector

1
推荐指数
1
解决办法
55
查看次数