- 主题:请教个stl的一个问题
最近打算用deque做一些事情,其中一个就是想把头部front()的元素内容(是个结构体)做一些改动。
查阅front()函数,介绍是说返回reference,以为这和平时用的引用是一回事,可是实际测试时发现这样并不能修改头部节点里面的内容。
所以想问问各位,这里的reference类型应该怎么理解,如果我想改deque中某个节点的内容,有什么比较好的方法,谢谢!
--
FROM 222.128.182.*
#include <deque>
#include <iostream>
using namespace std;
int main(){
deque<int> aa;
aa.push_back(4);
aa.push_back(5);
aa.front()=1;
for (auto& x: aa){
cout<<x<<std::endl;
}
}
$> g++ test.cpp
$> ./a.out
1
5
【 在 RGB (时光不再) 的大作中提到: 】
: 最近打算用deque做一些事情,其中一个就是想把头部front()的元素内容(是个结构体)做一些改动。
: 查阅front()函数,介绍是说返回reference,以为这和平时用的引用是一回事,可是实际测试时发现这样并不能修改头部节点里面的内容。
: 所以想问问各位,这里的reference类型应该怎么理解,如果我想改deque中某个节点的内容,有什么比较好的方法,谢谢!
: ...................
--
FROM 159.226.171.*
这个我刚试了,这样确实可以,我现在也是这样做的。
但如果节点类型不是int,而是一个struct,那要改这个节点struct中的一个变量,也只能用您这样的节点整体赋值的方法,是这样吧
【 在 blitz (blitz) 的大作中提到: 】
: 标 题: Re: 请教个stl的一个问题
: 发信站: 水木社区 (Wed Sep 2 10:17:26 2020), 站内
:
: #include <deque>
: #include <iostream>
: using namespace std;
: int main(){
: deque<int> aa;
: aa.push_back(4);
: aa.push_back(5);
: aa.front()=1;
: for (auto& x: aa){
: cout<<x<<std::endl;
: }
: }
:
:
: $> g++ test.cpp
: $> ./a.out
: 1
: 5
:
:
:
: 【 在 RGB (时光不再) 的大作中提到: 】
: : 最近打算用deque做一些事情,其中一个就是想把头部front()的元素内容(是个结构体)做一些改动。
: : 查阅front()函数,介绍是说返回reference,以为这和平时用的引用是一回事,可是实际测试时发现这样并不能修改头部节点里面的内容。
: : 所以想问问各位,这里的reference类型应该怎么理解,如果我想改deque中某个节点的内容,有什么比较好的方法,谢谢!
: : ...................
:
: --
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 159.226.171.*]
--
FROM 222.128.182.*
既然是引用,那就按照引用用啊,
int &t = aa.front();
【 在 RGB 的大作中提到: 】
:
: 这个我刚试了,这样确实可以,我现在也是这样做的。
: 但如果节点类型不是int,而是一个struct,那要改这个节点struct中的一个变量,也只能用您这样的节点整体赋值的方法,是这样吧
发自「今日水木 on Mi Note 3」
--
FROM 43.243.12.*
怎么用都可以。
你“试过了不可以”的代码能不能贴出来让大家批一下?
真是急死个人。
【 在 RGB (时光不再) 的大作中提到: 】
: 标 题: Re: 请教个stl的一个问题
: 发信站: 水木社区 (Wed Sep 2 10:59:29 2020), 站内
:
: 这个我刚试了,这样确实可以,我现在也是这样做的。
: 但如果节点类型不是int,而是一个struct,那要改这个节点struct中的一个变量,也只能用您这样的节点整体赋值的方法,是这样吧
:
: 【 在 blitz (blitz) 的大作中提到: 】
: : 标 题: Re: 请教个stl的一个问题
: : 发信站: 水木社区 (Wed Sep 2 10:17:26 2020), 站内
: :
: : #include <deque>
: : #include <iostream>
: : using namespace std;
: : int main(){
: : deque<int> aa;
: : aa.push_back(4);
: : aa.push_back(5);
: : aa.front()=1;
: : for (auto& x: aa){
: : cout<<x<<std::endl;
: : }
: : }
: :
: :
: : $> g++ test.cpp
: : $> ./a.out
: : 1
: : 5
: :
: :
: :
: : 【 在 RGB (时光不再) 的大作中提到: 】
: : : 最近打算用deque做一些事情,其中一个就是想把头部front()的元素内容(是个结构体)做一些改动。
: : : 查阅front()函数,介绍是说返回reference,以为这和平时用的引用是一回事,可是实际测试时发现这样并不能修改头部节点里面的内容。
: : : 所以想问问各位,这里的reference类型应该怎么理解,如果我想改deque中某个节点的内容,有什么比较好的方法,谢谢!
: : : ...................
: :
: : --
: :
: : ※ 来源:·水木社区 newsmth.net·[FROM: 159.226.171.*]
:
:
: --
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 222.128.182.*]
--
FROM 76.126.252.*
我最开始就是这么用的,没有生效
【 在 GoGoRoger (GoGoRoger) 的大作中提到: 】
: 标 题: Re:请教个stl的一个问题
: 发信站: 水木社区 (Wed Sep 2 11:49:17 2020), 站内
:
: 既然是引用,那就按照引用用啊,
:
: int &t = aa.front();
: 【 在 RGB 的大作中提到: 】
: :
: : 这个我刚试了,这样确实可以,我现在也是这样做的。
: : 但如果节点类型不是int,而是一个struct,那要改这个节点struct中的一个变量,也只能用您这样的节点整体赋值的方法,是这样吧
:
: 发自「今日水木 on Mi Note 3」
: --
: 生活好无趣,到水木吵架去。
:
: ※ 来源:·水木社区
http://www.newsmth.net·[FROM: 43.243.12.*]
--
修改:RGB FROM 222.128.182.*
FROM 222.128.182.*
别急,大家都是从“一定是编译器坏了”的路上走来的…
【 在 here080 () 的大作中提到: 】
: 怎么用都可以。
: 你“试过了不可以”的代码能不能贴出来让大家批一下?
: 真是急死个人。
: 【 在 RGB (时光不再) 的大作中提到: 】
--
FROM 124.217.188.*
我把代码粘贴过来了,做了些删减。
主要问题就是在AdjustDelay()函数中改头部节点的ref值,但到GetVAData()中拿到这个节点时,打印,引用计数仍是1
改完这个值时,不出AdjustDelay()函数打印ref值,是修改后的,正确的值。
struct SVidNode{
char *buf;
quint64 off;
quint32 len;
quint32 idx;//当前节点索引
quint64 ref;//做引用计数
}
class CVAMng
{
std::mutex mMutex;
std::deque<SVidNode> mFrameList;
char *mpBufPool;
quint64 mBufPoolSize;
quint64 mWritePos;
quint64 mReadPos;
float mDelaySamples;
float mFrameRate;
public:
CVAMng(quint64 VideoMemSize);
~CVAMng();
RETURN_CODE AdjustDelay(int off);
RETURN_CODE PutVAData(const void *pV, quint32 vLen, const void *pA, quin
t32 aSamples, quint32 idx);
RETURN_CODE GetVAData(void *pV, quint32& vLen, void *pA, quint32 aSample
s);
};
CVAMng::CVAMng(quint64 VideoMemSize)
: mBufPoolSize(VideoMemSize)
, mWritePos(0)
, mReadPos(0)
{
mpBufPool = new char[VideoMemSize];
memset(mpBufPool, 0, VideoMemSize);
mAudCache.Init(0);
}
CVAMng::~CVAMng()
{
std::lock_guard<std::mutex> locker(mMutex);
delete []mpBufPool;
mFrameList.clear();
}
RETURN_CODE CVAMng::AdjustDelay(quint32 off)
{
std::lock_guard<std::mutex> locker(mMutex);
if (mFrameList.empty())
return ERR_DONOTHING;
{
SVidNode& vNod = mFrameList.front();
vNod.ref += off;//试验中这样在GetVAData()中拿到的节点的ref仍是1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
return SUCCESS;
}
RETURN_CODE CVAMng::PutVAData(const void *pV, quint32 vLen, const void *pA,
quint32 aSamples, quint32 idx)
{
std::lock_guard<std::mutex> locker(mMutex);
//video
SVidNode vNod;
if (mWritePos + vLen <= mBufPoolSize)
{
memcpy(mpBufPool+mWritePos, pV, vLen);
vNod.off = mWritePos;
}
else
{
mWritePos = 0;
memcpy(mpBufPool, pV, vLen);
vNod.off = 0;
}
vNod.buf = mpBufPool + mWritePos;
vNod.ref = 1;
vNod.idx = idx;
mFrameList.push_back(vNod);
mWritePos += vLen;
return SUCCESS;
}
RETURN_CODE CVAMng::GetVAData(void *pV, quint32 &vLen, void *pA, quint32 aSa
mples)
{
std::lock_guard<std::mutex> locker(mMutex);
if (mFrameList.empty())
return ERR_NOMEMORY;
//video
SVidNode& vNod = mFrameList.front();
if (vNod.buf)
{
memcpy(pV, vNod.buf, vNod.eslen);
vLen = vNod.eslen;
mReadPos = vNod.off;
}
else
{
vLen = 0;
}
//此处打印节点ref,总不是预想值
--vNod.ref;
quint32 ref = vNod.ref;
if (vNod.ref == 0)
mFrameList.pop_front();
return SUCCESS;
}
【 在 here080 (hero080) 的大作中提到: 】
: 怎么用都可以。
: 你“试过了不可以”的代码能不能贴出来让大家批一下?
: 真是急死个人。
: ...................
--
修改:RGB FROM 222.128.182.*
FROM 222.128.182.*
你可不可以自己写一个最小程序来复现这个问题?
【 在 RGB (时光不再) 的大作中提到: 】
: 标 题: Re: 请教个stl的一个问题
: 发信站: 水木社区 (Wed Sep 2 13:04:23 2020), 站内
:
: 我把代码粘贴过来了,做了些删减。
: 主要问题就是在AdjustDelay()函数中改头部节点的ref值,但到GetVAData()中拿到这个节点时,打印,引用计数仍是1
:
: 改完这个值时,不出AdjustDelay()函数打印ref值,是修改后的,正确的值。
:
: struct SVidNode{
:
: char *buf;
:
: quint64 off;
:
: quint32 len;
:
: quint32 idx;//当前节点索引
:
: quint64 ref;//做引用计数
:
: }
:
: class CVAMng
:
: {
:
: std::mutex mMutex;
:
: std::deque<SVidNode> mFrameList;
:
: char *mpBufPool;
:
: quint64 mBufPoolSize;
:
: quint64 mWritePos;
:
: quint64 mReadPos;
:
: float mDelaySamples;
:
: float mFrameRate;
:
: public:
:
: CVAMng(quint64 VideoMemSize);
:
: ~CVAMng();
:
: RETURN_CODE AdjustDelay(int off);
:
: RETURN_CODE PutVAData(const void *pV, quint32 vLen, const void *pA, quin
: t32 aSamples, quint32 idx);
:
: RETURN_CODE GetVAData(void *pV, quint32& vLen, void *pA, quint32 aSample
: s);
:
: };
:
:
: CVAMng::CVAMng(quint64 VideoMemSize)
:
: : mBufPoolSize(VideoMemSize)
:
: , mWritePos(0)
:
: , mReadPos(0)
:
: {
:
: mpBufPool = new char[VideoMemSize];
:
: memset(mpBufPool, 0, VideoMemSize);
:
: mAudCache.Init(0);
:
: }
:
: CVAMng::~CVAMng()
:
: {
:
: std::lock_guard<std::mutex> locker(mMutex);
:
: delete []mpBufPool;
:
: mFrameList.clear();
:
: }
:
: RETURN_CODE CVAMng::AdjustDelay(quint32 off)
:
: {
:
: std::lock_guard<std::mutex> locker(mMutex);
:
: if (mFrameList.empty())
:
: return ERR_DONOTHING;
:
: {
:
: SVidNode& vNod = mFrameList.front();
:
: vNod.ref += off;//试验中这样在GetVAData()中拿到的节点的ref仍是1
:
: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:
: }
:
: return SUCCESS;
:
: }
:
: RETURN_CODE CVAMng::PutVAData(const void *pV, quint32 vLen, const void *pA,
: quint32 aSamples, quint32 idx)
:
: {
:
: std::lock_guard<std::mutex> locker(mMutex);
:
: //video
:
: SVidNode vNod;
:
: if (mWritePos + vLen <= mBufPoolSize)
:
: {
:
: memcpy(mpBufPool+mWritePos, pV, vLen);
:
: vNod.off = mWritePos;
:
: }
:
: else
:
: {
:
: mWritePos = 0;
:
: memcpy(mpBufPool, pV, vLen);
:
: vNod.off = 0;
:
: }
:
: vNod.buf = mpBufPool + mWritePos;
:
: vNod.ref = 1;
:
: vNod.idx = idx;
:
: mFrameList.push_back(vNod);
:
: mWritePos += vLen;
:
:
:
: return SUCCESS;
:
: }
:
: RETURN_CODE CVAMng::GetVAData(void *pV, quint32 &vLen, void *pA, quint32 aSa
: mples)
:
: {
:
: std::lock_guard<std::mutex> locker(mMutex);
:
: if (mFrameList.empty())
:
: return ERR_NOMEMORY;
:
: //video
:
: SVidNode& vNod = mFrameList.front();
:
: if (vNod.buf)
:
: {
:
: memcpy(pV, vNod.buf, vNod.eslen);
:
: vLen = vNod.eslen;
:
: mReadPos = vNod.off;
:
: }
:
: else
:
: {
:
: vLen = 0;
:
: }
:
: //此处打印节点ref,总不是预想值
:
: --vNod.ref;
:
: quint32 ref = vNod.ref;
:
: if (vNod.ref == 0)
:
: mFrameList.pop_front();
:
:
:
: return SUCCESS;
:
: }
:
:
:
:
: 【 在 here080 (hero080) 的大作中提到: 】
: : 怎么用都可以。
: : 你“试过了不可以”的代码能不能贴出来让大家批一下?
: : 真是急死个人。
: : ...................
:
: --
:
: ※ 修改:·RGB 于 Sep 2 13:08:39 2020 修改本文·[FROM: 222.128.182.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 222.128.182.*]
--
修改:RGB FROM 222.128.182.*
FROM 76.126.252.*
好的,稍晚些时候我写个小的测试程序
【 在 here080 (hero080) 的大作中提到: 】
: 你可不可以自己写一个最小程序来复现这个问题?
--
FROM 222.128.182.*