C++ 将指针数组推入std::vector,避免使用push_back复制对象
在这段代码中,在for循环中创建一个指针数组C++ 将指针数组推入std::vector,避免使用push_back复制对象,c++,pointers,random,stdvector,C++,Pointers,Random,Stdvector,在这段代码中,在for循环中创建一个指针数组newData,然后将其推入向量testData。指针存储在向量std::vector中 我关心的是,我需要确保指针引用的对象在向量持有对它们的引用时保持有效。调用行newData=newunsignedchar[frameSize]是否会丢失此引用在for循环中 我主要希望避免使用向后推复制对象 如何创建随机字符的无符号字符*数组(这里我只使用'a'),然后将这些数组推送到向量 int numFrames = 25; int frameSize =
newData
,然后将其推入向量testData
。指针存储在向量std::vector
中
我关心的是,我需要确保指针引用的对象在向量持有对它们的引用时保持有效。调用行newData=newunsignedchar[frameSize]是否会丢失此引用代码>在for循环中
我主要希望避免使用向后推
复制对象
如何创建随机字符的无符号字符*
数组(这里我只使用'a'
),然后将这些数组推送到向量
int numFrames = 25;
int frameSize = 100;
std::vector<unsigned char*> testData;
unsigned char *newData;
for (int i = 0; i < numFrames; i++) {
newData = new unsigned char[frameSize];
for (int j = 0; j < frameSize; j++) {
newData[j] = 'a'; // fill the frame with random data, 'a' here
}
testData.push_back(newData);
newData = 0; // ??
memset(&newData, 0, frameSize); // ??
}
std::cout << " testData " << testData.size() << "\n";
int numFrames=25;
int frameSize=100;
向量测试数据;
无符号字符*新数据;
对于(int i=0;inewData=newunsignedchar[frameSize]是否会丢失此引用代码>在for循环中
不,如果做得正确,这是完全可行的
但是,代码中有一些问题,在memset(&newData,0,frameSize);/代码>设置指针占用的内存,通常不超过8字节(取决于架构),大小为100字节,这会调用未定义的行为。您可能想要:
memset(&newData, 0, sizeof newData); // ??
但这并不能满足您的需要,取消指针将使您失去对数据的访问,您不希望这样,并且在每次迭代中将同一指针推送到向量,您将得到一个向量,其中填充了指向同一数据的同一指针
将其声明移动到for
循环中可以解决这个问题。您没有复制任何数据,而是在每次新的迭代中将指向新内存位置的新指针推送到向量中
如何创建随机字符的无符号字符*
数组(这里我只使用'a'
),然后将这些数组推送到向量`
您的代码应该如下所示:
#包括
#包括
#包括
intmain()
{
srand(time(0));//seed,不是最好的随机化器,但在这里完成了工作
const size\u t numFrames=25;//大小可以/应该是常量且无符号
常量大小\u t frameSize=100;
向量测试数据;
对于(大小i=0;i 这段代码看起来好吗?这完全取决于它应该做什么。我会说不,因为我认为没有必要使用原始指针memset(&newData,0,frameSize)“<代码> >不正确。请不要使用垃圾邮件标签。<代码> C++ 11 和 C++ 14 标签是针对C++标准的问题。如果您用当前的标准标记“代码> C++ +代码> >编译,就足够了,如果您依赖旧的,只标记不,这看起来不太好。非常好,一定会崩溃。为什么不使用(a)std::vector
,或者(b)std::vector
,或者,如果frameSize
是编译时已知的常量,(c)std::vector
?简而言之,你为什么认为你需要向量中的原始指针?除非你能找到一个令人信服的理由,否则很有可能你不需要这样做,而我提到的其中一个选项对于你所需的工作流来说是可行的,甚至是最优的。而且你似乎觉得指针是天生的引用对象在C++中,它们不是。谢谢你的评论!只是添加了我使用向量<代码>测试数据> /Case>,所以我的担心是我可以在循环中调用<代码>无符号char *NeDATA=No..…/Cuth>?我推到的向量会受到这个调用的影响吗?@ MaMaMeZad,你的问题的答案,是的,你可以,<代码> NeDATAs代码>将被视为不同的指针,在每次新迭代时指向不同的内存位置。每个向量元素将有不同的指针指向不同的数据,没有副本。检查我的答案,它应该可以解决您的问题
#include <iostream>
#include <vector>
#include <ctime>
int main()
{
srand(time(0)); //seed, not the best randomizer but does the job here
const size_t numFrames = 25; //sizes can/should be constant and unsigned
const size_t frameSize = 100;
std::vector<unsigned char *> testData;
for (size_t i = 0; i < numFrames; i++)
{
//in each iteration a new pointer
unsigned char *newData = new unsigned char[frameSize];
for (size_t j = 0; j < frameSize; j++)
{
newData[j] = 'a' + rand() % 26; //random alphabetic char
}
testData.push_back(newData);
}
std::cout << "testData " << testData.size() << "\n";
for (size_t i = 0; i < numFrames; i++) //test print
{
for (size_t j = 0; j < frameSize; j++)
{
std::cout << testData[i][j];
}
std::cout << "\n";
}
}