标签: stdvector

动态创建std :: vector //创建指向矢量的指针

我是新人,所以我很可能错过了一些关键.

我正在使用std :: vector来存储来自ReadFile操作的数据.

目前我有一个名为READBUFF的结构,它包含一个byte向量.然后,READBUFF通过名为Reader的类中的私有类型进行实例化.

class Reader{
public:
void Read();
typedef struct {
std::vector<byte> buffer;
} READBUFF;

private:
READBUFF readBuffer;
}
Run Code Online (Sandbox Code Playgroud)

在Read()中,我当前将数组的大小调整为我想要的大小,因为默认分配器创建了一个非常大的向量[4292060576]

void Reader::Read()
{
readBuffer.buffer.resize(8192);
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但后来我想我宁愿动态新建矢量内联,所以我控制指针的分配管理.我将缓冲区更改为:std :: vector*buffer.当我尝试执行以下操作时,未将缓冲区设置为新缓冲区.从调试器中可以清楚地看出它没有被初始化.

void Reader::Read()
{
 key.buffer =  new std::vector<byte>(bufferSize);
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试了,但这与上面的行为相同.

void Reader::Read()
{
std::vector<byte> *pvector = new std::vector<byte>(8192);
key.buffer = pvector;
}
Run Code Online (Sandbox Code Playgroud)

主要的第一个问题是为什么这不起作用?为什么我不能将缓冲区指针分配给有效指针?另外,我如何定义内联分配的大小与必须调整大小?

我的最终目标是"新建"缓冲区,然后将它们存储在双端队列中.现在我这样做是为了重用上面的缓冲区,但我本质上是将缓冲区复制到另一个新的缓冲区,当我想要的是存储一个指向创建的原始缓冲区的指针.

 std::vector<byte> newBuffer(pKey->buffer);
 pKey->ptrFileReader->getBuffer()->Enqueue(newBuffer);
Run Code Online (Sandbox Code Playgroud)

提前致谢.我发现,当我发布这篇文章时,我错过了一些基本但我不知所措.

c++ stdvector

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

C++中的Vector:为什么外部维度给出了EXC_BAD_ACCESS而内部维度没有?

我有以下代码为整数向量的向量(即整数矩阵..)

vector<vector<int> > scores (3, vector<int>(2,0));
cout<<scores[1][5];
Run Code Online (Sandbox Code Playgroud)

这不会给出EXC_BAD_ACCESS,但这样做:

cout<<scores[5][1];
Run Code Online (Sandbox Code Playgroud)

为什么行为不同?

只是为了澄清:这并不是特定于给出的示例数字.当内部维度超出界限时,永远不会出现错误,外部则不然!

c++ vector stdvector

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

指针传染媒介对另一个传染媒介的元素的而不是克隆传染媒介

我想有一个向量z,并能够访问它z[i]或*pz[i],其中*pz[i]指出z[i].所以有一组值,但有两种方法可以访问它.

这是我的代码:

std::vector<double> z;
std::vector<double*> pz;

for (int i = 0; i < 5; i++) {
  z.push_back(7+0.01*i);
  std::cout << i << "  z = " << z << std::endl;
  pz.push_back(&z.back());
  std::cout << i << "  pz = " << pz << std::endl;
  std::cout << i << "  *pz = " ;
  for (int j = 0; j < pz.size(); j++) {
    std::cout << "  " << *pz[j];
  }
  std::cout << std::endl;
} …
Run Code Online (Sandbox Code Playgroud)

c++ pointers stdvector

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

消除std :: vector中的重复项

我有一个非常大的std :: vector std :: vectors,它包含固定数量的无符号整数.

所有uint向量都按升序排序.

我目前消除重复向量的方法是

unsigned int i = 0;
while ( i < new_combs.size() )
{
  unsigned int j = i + 1;
  while ( j < new_combs.size() )
  {
     unsigned int k = 0;
     while ( k < new_combs.at(i).size() && new_combs.at(i).at(k) == new_combs.at(j).at(k) )
        ++k;
     if ( k == new_combs.at(j).size() )
        new_combs.erase(new_combs.begin() + j);
     else
        ++j;
  }
  ++i;
}
Run Code Online (Sandbox Code Playgroud)

这里,new_combs是包含如上所述的向量的向量.

如果向量矢量未排序,是否有更有效的方法来消除重复?

c++ algorithm stdvector

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

在向量中创建新的空字段

所以我有一个向量,初始是空的,但肯定会被填满.它包含结构实例:

struct some {
    int number;
    MyClass classInstance;
}

/*Meanwhile later in the code:*/
vector<some> my_list;
Run Code Online (Sandbox Code Playgroud)

当它发生时,我想为向量添加值,我需要将其放大一个.但是,当然,我不想创建任何变量来做到这一点.没有这个请求,我会这样做:

//Adding new value:
some new_item;       //Declaring new variable - stupid, ain't it?
my_list.push_back(new_item); //Copying the variable to vector, now I have it twice!
Run Code Online (Sandbox Code Playgroud)

所以,相反,我想new_item通过增加它的大小来创建矢量 - 看看:

int index = my_list.size();
my_list.reserve(index+1);  //increase the size to current size+1 - that means increase by 1
my_list[index].number = 3;  //If the size was increased, index now contains offset of last item
Run Code Online (Sandbox Code Playgroud)

但这不起作用!似乎空间没有分配 - 我得到 …

c++ memory-management stdvector

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

迭代器不能访问完整的向量

int main()
{
    vector<int> vi;

    vi.reserve(10);
   // back_insert_iterator<vector<int> > iter(vi);

    vector<int>::iterator iter = vi.begin();

    *iter = 1;
    ++iter;
    *iter = 2;
    ++iter;
    *iter = 3;

    back_insert_iterator<std::__1::vector<int> > iterb(vi);
    back_inserter(vi) = 4;
    back_inserter(vi) = 5;

    vi.reserve(vi.size() * 2);
    copy(vi.begin(), vi.end(), vi.end());

    ostream_iterator<int> os(cout, " ");
    copy(vi.begin(), vi.end(), os);
}
Run Code Online (Sandbox Code Playgroud)

问题1,为什么cout打印4 5,我预计会打印1 2 3 4 5 1 2 3 4 5?问题2,当我更换它时copy(vi.begin(), vi.end(), back_insert(vi)),它会打印4 5 4 5,为什么?

c++ stdvector

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

在向量引用上调用vector :: reserve()

我已经提出了一个解释现象的理论,但我希望有一个知识渊博的人来承担我.

在客户端代码中,我有:

vector<bool> candidates;
fillCandidates(candidates);
Run Code Online (Sandbox Code Playgroud)

在被叫方,我有:

void fillCandidates(vector<bool>& candidates)
{
    // reserve space for two elements
    candidates.reserve(2);
    candidates[0] = true;
    candidates[1] = false;
    // here, candidates.size() == 0
}
Run Code Online (Sandbox Code Playgroud)

当我在函数返回后检查候选人的大小时,它是0!发生了什么?我正在使用64位Ubuntu 12.04上的CMake脚本调用gcc 4.6.3(但我认为所有这些实际上都是无关紧要的).

注意:我提供了我的解释作为答案.

编辑:接受的答案和评论在时间上打败了我,所以我的解释不会添加任何东西.

c++ stl stdvector

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

创建C ++向量的排序副本最有效的方法是什么?

给定一个C ++向量(假设它是双精度数,我们称它为unsorted),最有效的方法是创建一个新的向量sorted,该向量包含一个排序的副本unsorted?

考虑以下简单的解决方案:

std::vector<double> sorted = unsorted;
std::sort(sorted.begin(), sorted.end());
Run Code Online (Sandbox Code Playgroud)

此解决方案有两个步骤:

  1. 创建的完整副本unsorted。
  2. 把它分类。

但是,在步骤1的初始副本中可能会浪费很多精力,尤其是对于(例如)已经被大量排序的大型矢量而言。

如果我用手编写此代码,则可以通过将第一遍读取unsorted向量中的值,同时将它们(根据需要进行部分排序)写入向量中,从而将排序算法的第一遍与步骤1结合起来sorted。根据算法,随后的步骤可能仅适用于中的数据sorted。

有没有办法使用C ++标准库,Boost或第三方跨平台库来执行此操作?

重要的一点是要确保sorted在排序开始之前,不必将C ++向量的内存不必要地初始化为零。许多排序算法将要求立即对sorted向量进行随机写入访问,因此使用,reserve()并且push_back()对于该第一遍将不起作用,但resize()会浪费时间初始化向量。


编辑:由于答案和评论不一定了解为什么“单纯的解决方案”效率低下,请考虑以下情况:unsorted数组实际上已经按排序顺序排序(或者只需要一次交换就可以排序)。在那种情况下,无论采用哪种排序算法,使用朴素的解决方案,每个值都至少需要读取两次-复制时一次,排序时一次。但是使用分时复制解决方案,读取次数可能减半,因此性能大约翻倍。unsorted当使用性能更高的排序算法std::sort(可能是O(n)而不是O(n log n))时,不管中的数据如何,都会出现类似的情况。

c++ sorting stdvector

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

将对象移入std :: vector时的异常保证

如果在将对象移至std :: vector时内存分配失败,并且抛出bad_alloc,std :: vector是否保证从对象移出的对象不变/仍然有效?

例如:

std::string str = "Hello, World!";
std::vector<std::string> vec;

vec.emplace_back(std::move(str));
/* Is str still valid and unaltered if the previous line throws? */
Run Code Online (Sandbox Code Playgroud)

c++ stdvector exception-safety

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

如何遍历地图向量

我编码很有趣。我创建了一个地图矢量来查看我可以使用容器做什么。当我遍历矢量时,只有Alfred和Angela出现。如何显示所有名称?可能吗 这是我到目前为止的内容:

#include <map>
#include <iostream>
#include <conio.h>
#include <vector>
#include <string>

int main()
{
    //create a map
    std::map<std::string, unsigned int> mySuperCoolMap;
    mySuperCoolMap["Edward"] = 39;
    mySuperCoolMap["Daniel"] = 35;
    mySuperCoolMap["Carlos"] = 67;
    mySuperCoolMap["Bobby"]  =  8;
    mySuperCoolMap["Alfred"] = 23;

    std::cout << "\n\n";

    //Ranged based for loop to display the names and age
    for (auto itr : mySuperCoolMap)
    {
        std::cout << itr.first << " is: " << itr.second << " years old.\n";
    }

    //create another map
    std::map<std::string, …
Run Code Online (Sandbox Code Playgroud)

c++ iterator stdmap stdvector c++14

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