List用来存储string时遇到的问题

ufouser 2003-08-20 05:18:25
//输入10个单词作为字典,用list有序存放,并输出最终结果
#include <iostream>
#include <list>
#include <cstdlib>
#include <string>
#include <ctime>
using namespace std;

template <class T>
class OrderList
{
public:void InsertOrder (T newword);
void Showdic ( void );
private:list<T> dicList;
};

template <class T>
void OrderList<T>::InsertOrder (T newword)
{
list<T>::iterator currPtr = dicList.begin();
list<T>::iterator nextPtr = dicList.begin();
while (nextPtr != dicList.end())
{
currPtr = nextPtr;
nextPtr++;
}

if (newword > *currPtr)
{
dicList.push_back(newword);
return;
}
for ( currPtr = dicList.begin(); currPtr != dicList.end(); currPtr++)
{
if (newword < *currPtr)
{
dicList.insert(currPtr,newword);
break;
}
}
}

template <class T>
void OrderList<T>::Showdic (void)
{
cout << endl << "Now showing dictionary:" << endl;
for (list<T>::iterator ps = dicList.begin(); ps != dicList.end(); ps++)
{
cout << *ps << " ";
}
}

int main ( )
{
OrderList<string> strlist;
for (int i = 0; i < 10; i++)
{
string str;
cout << endl << "Enter a word: " << flush;
cin >> str;
strlist.InsertOrder(str);
}
strlist.Showdic();

system("pause");
return 0;
}

1.在VC++6.0上:
总是给出警告.运行时输入第一个单词后就出现非法操作提示.
如果用int代替string测试则不警告.并且运行正常
2.在DEV-CPP4.9.8.0下某一台机上曾有一次编译完全正确.并且运行正常

请指出出错原因并给出修改方案.
...全文
117 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
oopig 2003-08-20
  • 打赏
  • 举报
回复
这些警告是编译器的问题,而且只在debug模式下有,不影响运行。
ufouser 2003-08-20
  • 打赏
  • 举报
回复
谢谢各位的帮助.不过不论以两位其中一位的方法修改了以后警告都依然存在(VC++6.0).只是运行时正常了.
可能是我的机有点问题.警告内容如下:

Deleting intermediate files and output files for project 'testlist - Win32 Debug'.
--------------------Configuration: testlist - Win32 Debug--------------------
Compiling...
main.cpp
c:\program files\microsoft visual studio\vc98\include\list(131) : warning C4786: 'std::reverse_bidirectional_iterator<std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_trai
ts<char>,std::allocator<char> > > >::iterator,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,std::allocator<ch
ar> > *,int>' : identifier was truncated to '255' characters in the debug information
c:\program files\microsoft visual studio\vc98\include\list(129) : while compiling class-template member function '__thiscall std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char
,std::char_traits<char>,std::allocator<char> > > >::std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >(const std::allocator<std::basi
c_string<char,std::char_traits<char>,std::allocator<char> > > &)'
c:\program files\microsoft visual studio\vc98\include\list(131) : warning C4786: 'std::reverse_bidirectional_iterator<std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_trai
ts<char>,std::allocator<char> > > >::const_iterator,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::
allocator<char> > const *,int>' : identifier was truncated to '255' characters in the debug information
c:\program files\microsoft visual studio\vc98\include\list(129) : while compiling class-template member function '__thiscall std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char
,std::char_traits<char>,std::allocator<char> > > >::std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >(const std::allocator<std::basi
c_string<char,std::char_traits<char>,std::allocator<char> > > &)'
c:\program files\microsoft visual studio\vc98\include\list(131) : warning C4786: 'std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >:
:list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : identifier was truncated to '255' characters in the debug information
c:\program files\microsoft visual studio\vc98\include\list(153) : warning C4786: 'std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >:
:~list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : identifier was truncated to '255' characters in the debug information
Linking...

testlist.exe - 0 error(s), 4 warning(s)

是编译器的问题吗?
如果是的话那就结帖了

oopig 2003-08-20
  • 打赏
  • 举报
回复
如果考虑到效率问题,可以:
1。InsertOrder只做push_back操作。
2。等所有的单词都insert完后,在执行sort操作
oopig 2003-08-20
  • 打赏
  • 举报
回复
你的InsertOrder那么必要那么写,如下就可以:
template <class T>
void OrderList<T>::InsertOrder (T newword)
{
dicList.push_back(newword);
dicList.sort();
}
rtdb 2003-08-20
  • 打赏
  • 举报
回复
当开始时, 链表为空, *currPtr无意义
if (newword > *currPtr) 这一句自然出错了。
下面的在VC6测试通过:


template <class T>
void OrderList<T>::InsertOrder (T newword)
{
list<T>::iterator currPtr = dicList.begin();
if ( currPtr == dicList.end() )
{//list is empty now
dicList.push_back(newword);
return;
}

//check last one
currPtr = dicList.end() ;
currPtr -- ;
if (newword > *currPtr)
{
dicList.push_back(newword);
return;
}
for ( currPtr = dicList.begin(); currPtr != dicList.end(); currPtr++)
{
if (newword < *currPtr)
{
dicList.insert(currPtr,newword);
break;
}
}
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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