如何在deque中删除一个元素(急)

ascap 2005-05-07 10:47:33
我定义的deque中的元素是一个结构体,在利用自带的erase 做删除的时候,编译没有
错误,但在执行的过程中会出错,而且很奇怪删除begin()时不出错,假如其中有10个
元素,在删除第2个(包括第2个)之后的元素都会报错。代码如下
std::deque< Strustudent > m_studeque;
m_studeque.erase( m_studeque.begin() +2 );
就会出错什么原因呢,望有心人指教。
...全文
1059 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzgyb 2005-05-08
  • 打赏
  • 举报
回复
确实这样,不知为什么
但在DevCpp下没有错误

好像char hostPath[6][256]
这有些影响,小一点可以
char hostPath[6][50]

ascap 2005-05-08
  • 打赏
  • 举报
回复
真是很郁闷啊。
我添加的时候把结构体中的变量只留下FileName,其它的都注释掉就可以删除了,
但如果变量都保留添加后再删除就会有问题。
bing_huo 2005-05-08
  • 打赏
  • 举报
回复
没发现你的结构有什么问题


还有假如两个进程都要去操作队列需要互斥保护吗?还是队列自身就可以完成.

当然需要 stl是不提供线程安全的 你自己把stl容器包一下吧 加上临界区 或者 互斥锁
ascap 2005-05-08
  • 打赏
  • 举报
回复
拜托啊,在线等待。
是不是结构体中的数据类型用的不合理?
还有假如两个进程都要去操作队列需要互斥保护吗?还是队列自身就可以完成.
ascap 2005-05-08
  • 打赏
  • 举报
回复
整理后的结构体定义如下:
struct SK_SongInformation
{
char FileName[30];
char songID[8];
char name[100];
char star[100];
char localPath[256];
char hostPath[6][256];
char bh[10];
char accompanyTrack[10] ;
char originalTrack[10];
long accompanyVolume;
long originalVolume;
long bright;
long saturation;
long contrast;
char tc[1024];

bool operator==( const SK_SongInformation &songInfo )
{
return !strcmp( FileName, songInfo.FileName );
}


};
ascap 2005-05-08
  • 打赏
  • 举报
回复

结构体:
struct SK_SongInformation
{
char FileName[30]; // ÎïÀíÎļþÃû
char songID[8]; // 񅧏
char name[100]; // ¸èÃû
char star[100]; // ¸èÊÖ
//enum SongVersion version; // °æ±¾

char localPath[256]; // ±¾µØ·¾¶
char hostPath[6][256]; // Ö÷»ú1¡«6
char bh[10]; // ¸èÇúµÄ±àºÅ

char accompanyTrack[10] ; // °é³ª
char originalTrack[10]; // Ô­³ª

//enum SongFormat type; // ýÌå¸ñʽ

long accompanyVolume; // °é³ªÒôÁ¿
long originalVolume; // Ô­³ªÒôÁ¿

long bright; // ÁÁ¶È£¬È¡Öµ0¡«1200
long saturation; // ±¥ºÍ¶È£¬È¡Öµ0¡«1000
long contrast; // ¶Ô±È¶È£¬È¡Öµ0¡«1200

char tc[1024]; // ¸èÇúÌá´Ê

bool operator==( const SK_SongInformation &songInfo )
{
return !strcmp( FileName, songInfo.FileName );
}


};
添加的过程
SK_SongInformation objSong;

objSong.accompanyVolume = 80;
objSong.originalVolume = 80;
strcpy( objSong.FileName, "4" );

strcpy( objSong.hostPath[0], "\\\\192.168.0.82" );
strcpy( objSong.localPath,"f:\\song\\beau.mpg");
strcpy( objSong.accompanyTrack,"左" );
strcpy( objSong.originalTrack,"右" );

m_SongList.push_back( objSong );

objSong.accompanyVolume = 80;
objSong.originalVolume = 80;
strcpy( objSong.FileName, "3.mpg" );

strcpy( objSong.hostPath[0], "\\\\192.168.0.82" );
strcpy( objSong.localPath,"f:\\song\\chunni.mpg");
strcpy( objSong.accompanyTrack,"×ó" );
strcpy( objSong.originalTrack,"ÓÒ" );

m_SongList.push_back( objSong );

objSong.accompanyVolume = 80;
objSong.originalVolume = 80;
strcpy( objSong.FileName, "2.mpg" );
strcpy( objSong.hostPath[0], "\\\\192.168.0.82" );
strcpy( objSong.localPath,"f:\\song\\shinian.mpg");
strcpy( objSong.accompanyTrack,"3" );
strcpy( objSong.originalTrack,"2" );

m_SongList.push_back( objSong );

objSong.accompanyVolume = 80;
objSong.originalVolume = 80;
strcpy( objSong.FileName, "1.mpg" );
strcpy( objSong.hostPath[0], "\\\\192.168.0.82" );
strcpy( objSong.localPath,"f:\\song\\aiai.mpg");
strcpy( objSong.accompanyTrack,"3" );
strcpy( objSong.originalTrack,"2" );

m_SongList.push_back( objSong );

删除:
m_SongList.erase( m_SongList.begin() + 1 );

乱码都是汉字不用理会的我就不会改了。我想因该不会是它的问题。


xzgyb 2005-05-08
  • 打赏
  • 举报
回复
ascap(单只只) :
如果方便的话最好把你的调试的代码贴上来
我用你贴上来的那些没有什么问题
ascap 2005-05-08
  • 打赏
  • 举报
回复
我只要运行到删除的位置就会报内存相关的错误。
ascap 2005-05-08
  • 打赏
  • 举报
回复
大家帮忙啊,解决就散分啊。

在线等待。
ascap 2005-05-08
  • 打赏
  • 举报
回复
那我究竟是出错在什么地方了啊?
真实很头痛啊。
xzgyb 2005-05-08
  • 打赏
  • 举报
回复
#include <deque>
#include <iostream>

using namespace std;

struct SK_SongInformation
{
char FileName[30];
char localPath[256];
char tc[1024];

inline bool operator==( const SK_SongInformation &songInfo )
{
return !strcmp( FileName, songInfo.FileName );
}
} ;


int
main()
{
deque< SK_SongInformation > m_SongList;

SK_SongInformation objSong;
strcpy( objSong.FileName, "a");

m_SongList.push_back( objSong );
strcpy( objSong.FileName, "b");

m_SongList.push_back( objSong );
strcpy( objSong.FileName, "c" );

m_SongList.push_back( objSong );
strcpy( objSong.FileName, "d" );

m_SongList.push_back( objSong );

cout << m_SongList.size() << endl;
m_SongList.erase( m_SongList.begin() + 2);

cout << m_SongList.size() << endl;

return 0;
}

没有问题
ascap 2005-05-08
  • 打赏
  • 举报
回复
对不起,我是用的strcpy,只是着急直接写成了=“a"的形式。
bing_huo 2005-05-08
  • 打赏
  • 举报
回复
objSong.FileName ="a";


这个肯定不对啊。。。char数组怎么可以这样赋值。。。。。。

strcpy(objSong.FileName, "a"); 都改成这样再测
xzgyb 2005-05-08
  • 打赏
  • 举报
回复
首先你得FileName赋值就不对
objSong.FileName ="a";
应用
strcpy(objSong.FileName, "a");

或者声明为string
string FileName;
其他类似
ascap 2005-05-08
  • 打赏
  • 举报
回复
caslwzgks(梦想家)你好:
你在你的队列中只加三个试试删除最后一个。
ascap 2005-05-08
  • 打赏
  • 举报
回复
我是用的VC6+SP5。
队列定义:
#include <deque>
using namespace std;

std::deque< SK_SongInformation > m_SongList;

结构体如下:
struct SK_SongInformation
{
char FileName[30];
char localPath[256];
char tc[1024];
inline bool operator==( const SK_SongInformation &songInfo )
{
return !strcmp( FileName, songInfo.FileName );
}

添加过程如下:
std::deque< SK_SongInfromation > m_SongList;

SK_SongInformation objSong;
objSong.FileName ="a";
m_SongList.push_back( objSong );
objSong.FileName = "b";
m_SongList.pubsh_back( objSong );
objSong.FileName = "c";
m_SongList.pubsh_back( objSong );
objSong.FileName = "d";
m_SongList.pubsh_back( objSong );

删除过程:
m_SongList.erase( m_SongList.begin() + 2);

请大家帮忙分析一下.
caslwzgks 2005-05-08
  • 打赏
  • 举报
回复
在我的VC6 +SP6下没有任何错误。

#include <deque>
using namespace std;

struct SK_SongInformation
{
char FileName[30];

inline bool operator == ( SK_SongInformation &songInfo )
{
return !strcmp( FileName, songInfo.FileName );
}
};


int main(int argc, char* argv[])
{
deque< SK_SongInformation > dq;

for( int i = 0; i < 10; i++){

SK_SongInformation si;
sprintf(si.FileName,"Song %d",i + 1);
dq.push_back(si);
}

dq.erase( dq.begin() + 2 );

deque< SK_SongInformation >::const_iterator it = dq.begin();
for(; it != dq.end(); ++it )
cout<< it->FileName << endl;

return 0;
}

输出:
Song 1
Song 2
Song 4
Song 5
Song 6
Song 7
Song 8
Song 9
Song 10
xzgyb 2005-05-08
  • 打赏
  • 举报
回复
把相关的代码贴出来吧,要不然大家没法帮你调试阿
BluntBlade 2005-05-08
  • 打赏
  • 举报
回复
楼主把代码贴出来算了。
bing_huo 2005-05-08
  • 打赏
  • 举报
回复
按照你的代码 在vc7。1下测试 删除没有问题啊。。。。连续多次删除 也没问题

不知道你是什么版本的编译器 可以尝试这样改一下

void SK_PlayList::deleSong( int DelNum )
{
std::deque< SK_SongInformation >::iterator it = m_SongList.begin();
m_SongList.erase( it + DelNum );
}

另外你能不能保证deque的初值正确?

加载更多回复(21)

64,670

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧