熟悉SGI STL的请进

dibotiger 2016-05-12 11:05:57
VC6自带的STL的list无法排序, 就下载了SGI STL, 替换了VC6 自带的STL

测试代码如下(VC6的STL环境编译无误, 替换SGI STL后, 出现如下编译错误):

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string>
#include <list>
using namespace std;

typedef struct tagURLDNSWITHCOUNT
{
char szurldns[1024];
DWORD dwcount;
}URLDNSCOUNT;

typedef list<URLDNSCOUNT> URLDNSCOUNTS;
URLDNSCOUNTS listURLCOUNTS;


void printflist()
{
URLDNSCOUNTS::iterator i;
for(i=listURLCOUNTS.begin();i!=listURLCOUNTS.end();++i)
{
printf("%s-%d\n",i->szurldns,i->dwcount);
}
}

void main(int argc, char *argv[])
{
URLDNSCOUNT oneURLDNSCOUNT={0},twoURLDNSCOUNT={0},threeURLDNSCOUNT={0};
sprintf(oneURLDNSCOUNT.szurldns,"111");
oneURLDNSCOUNT.dwcount=123;
sprintf(twoURLDNSCOUNT.szurldns,"222");
twoURLDNSCOUNT.dwcount=33;
sprintf(threeURLDNSCOUNT.szurldns,"333");
threeURLDNSCOUNT.dwcount=99;
listURLCOUNTS.push_back(oneURLDNSCOUNT);
listURLCOUNTS.push_back(twoURLDNSCOUNT);
listURLCOUNTS.push_back(threeURLDNSCOUNT);

printflist();
//listURLCOUNTS.sort();
}


Compiling...
test.cpp
E:\test\test.cpp(23) : error C2819: type 'std::_List_iterator<struct tagURLDNSWITHCOUNT,struct tagURLDNSWITHCOUNT &,struct tagURLDNSWITHCOUNT *>' does not have an overloaded member 'operator ->'
E:\test\test.cpp(23) : error C2227: left of '->szurldns' must point to class/struct/union
E:\test\test.cpp(23) : error C2819: type 'std::_List_iterator<struct tagURLDNSWITHCOUNT,struct tagURLDNSWITHCOUNT &,struct tagURLDNSWITHCOUNT *>' does not have an overloaded member 'operator ->'
E:\test\test.cpp(23) : error C2227: left of '->dwcount' must point to class/struct/union
Error executing cl.exe.


另外, 如果我希望能够对list里的dwcount节点进行排序, 该如何实现?

...全文
113 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你的问题和STL版本无关少了结构体排序需要自定义operator< 另外VC6已经是18年前的东西了,赶紧升级到VS2015吧.
#include <stdio.h>
#include <stdlib.h>
//#include <windows.h>
#include <string>
#include <list>
using namespace std;
typedef unsigned int DWORD;

typedef struct tagURLDNSWITHCOUNT
{
    char  szurldns[1024];
    DWORD dwcount;
} URLDNSCOUNT;

typedef list<URLDNSCOUNT>    URLDNSCOUNTS;
URLDNSCOUNTS        listURLCOUNTS;

bool operator<(const URLDNSCOUNT& l,const URLDNSCOUNT&r){ return l.dwcount<r.dwcount;}
void printflist()
{
    URLDNSCOUNTS::iterator i;

    for( i = listURLCOUNTS.begin(); i != listURLCOUNTS.end(); ++i )
    {
        printf( "%s-%d\n", i->szurldns, i->dwcount );
    }
}

void main( int argc, char *argv[] )
{
    URLDNSCOUNT oneURLDNSCOUNT = {0}, twoURLDNSCOUNT = {0}, threeURLDNSCOUNT = {0};
    sprintf( oneURLDNSCOUNT.szurldns, "111" );
    oneURLDNSCOUNT.dwcount = 123;
    sprintf( twoURLDNSCOUNT.szurldns, "222" );
    twoURLDNSCOUNT.dwcount = 33;
    sprintf( threeURLDNSCOUNT.szurldns, "333" );
    threeURLDNSCOUNT.dwcount = 99;
    listURLCOUNTS.push_back( oneURLDNSCOUNT );
    listURLCOUNTS.push_back( twoURLDNSCOUNT );
    listURLCOUNTS.push_back( threeURLDNSCOUNT );

    printflist();
	puts("");
    listURLCOUNTS.sort();
	printflist();
}
oyljerry 2016-05-12
  • 打赏
  • 举报
回复
你这种直接用VS2012或以上的新版本编译器好了,对STL支持很好了

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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