社区
其它技术问题
帖子详情
请问如何用c或c++对几十万行文本进行排序、删除重复行?
amo73
2007-07-19 04:34:58
方法有不少:
1-导入数据库,排序、删除重复行,输出;
2-用工具软件,如UE;
3-在linux下先sort后uniq;
但是现在需要集成到自己的程序里,希望大家能给出较详细的代码例子,谢谢!
...全文
1735
33
打赏
收藏
请问如何用c或c++对几十万行文本进行排序、删除重复行?
方法有不少: 1-导入数据库,排序、删除重复行,输出; 2-用工具软件,如UE; 3-在linux下先sort后uniq; 但是现在需要集成到自己的程序里,希望大家能给出较详细的代码例子,谢谢!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
33 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
浪里个儿浪
2012-03-20
打赏
举报
回复
楼主,求您的主函数呀!
sylvanaszm
2008-12-12
打赏
举报
回复
mark
lnuzwy
2008-11-06
打赏
举报
回复
上空飘过~
lann64
2008-10-26
打赏
举报
回复
怎么看都是脚本语言最简单。
yjuufgef
2008-10-26
打赏
举报
回复
[Quote=引用 18 楼 lbaby 的回复:]
推荐直接用sort
或者使用脚本,省时,省下的时间可以用来陪MM。
何乐而不为呢?
[/Quote]
laf~
iGarlic
2008-10-22
打赏
举报
回复
用stl的map就行了吧
勇敢的天牛
2008-07-29
打赏
举报
回复
以上方法,我保证比数据库快很多倍
勇敢的天牛
2008-07-29
打赏
举报
回复
几十万行数据排序还是比较简单的,按100万算吧,一条256字节,极限消耗244M的内存,基本消耗和你文件大小一样
所以直接把数据读进内存就好了。
数据结构上用哈希表呗,好处是自动排重,同时节约内存。
取前四个字节,有456976中情况,对于100万数据,速度应该很理想,内存消耗不足2M
重复的时候使用strcmp排序,大概只比较两个串大小,应该很快,除非你的数据有规律
如果你的数据有规律比如都是http://这种开头,就要提前处理下,要不就死定了
qjyh
2008-06-29
打赏
举报
回复
定义一个有序set,自己指定比较器,读取文件每一行,插入该set,输出该set。
liveforlov
2008-06-25
打赏
举报
回复
用awk+脚本,速度比你的代码快多了
UltraBejing
2008-04-30
打赏
举报
回复
不明LZ在说什么
Super.Jiju
2008-03-02
打赏
举报
回复
用hash吧
Google他们就是用这样的方式来删除重复网址的吧
如果仅仅用hash似乎不能排序哎
可以做个参考:
http://blog.csdn.net/jiju8484/archive/2008/03/01/2137499.aspx
gunsand
2008-01-24
打赏
举报
回复
用脚本。比较EASY。
jsphuang
2007-11-09
打赏
举报
回复
用C/C++还是导入数据库比较容易处理
neversaydie518
2007-10-29
打赏
举报
回复
晕的
lbaby
2007-10-10
打赏
举报
回复
推荐直接用sort
或者使用脚本,省时,省下的时间可以用来陪MM。
何乐而不为呢?
waterfield
2007-09-17
打赏
举报
回复
用范型sort 和unique 应该比较简单吧
loops
2007-09-13
打赏
举报
回复
上面错了,请增加一个
bool pr2( const StringIndex::value_type &l, const StringIndex::value_type &r )
{
if( l.second!=r.second ){ return false; }
if( strcmp(l.first, r.first )==0 ){return true;}
return false;
}
并且将index.erase(unique(index.begin(),index.end(),pr1),index.end());改成
index.erase(unique(index.begin(),index.end(),pr2),index.end());
loops
2007-09-13
打赏
举报
回复
#include <vector>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define LARGENUMBER 6293815
class CHashString
{
public:
CHashString(){ InitHash(); }
void InitHash()
{
index = 1;
sum = 0;
multiple = LARGENUMBER;
}
unsigned long ConsumeChar( char c )
{
sum+=multiple*index++*c;
multiple*=LARGENUMBER;
return sum;
}
unsigned long GetCurSum(){ return sum; }
public:
int index;
unsigned long sum;
unsigned long multiple;
};
typedef vector<pair<char*, unsigned long> > StringIndex;//first 是指针,second是hash值
class CreateStringIndex
{
public:
CreateStringIndex():buffer(NULL){}
~CreateStringIndex(){ delete []buffer; }
StringIndex & GetStringIndex(){ return index; }
bool Create(const char *pFileName )
{
size_t pInd=0;
CHashString hashString;
StringIndex::value_type temp;
ifstream infile( pFileName, ios::binary);
if( infile.fail() ){
return false;
}
infile.seekg(0,ios::end);
length=infile.tellg();
infile.seekg(0,ios::beg);
delete []buffer;
buffer = new char[length+1];
istreambuf_iterator<char> it(infile);
istreambuf_iterator<char> ed;
while( pInd < length )
{
if( *it == '\r' || *it == '\n' )
{
buffer[pInd++]=0;
++it;
if( temp.first )
{
temp.second = hashString.GetCurSum();
index.push_back( temp );
}
hashString.InitHash();
temp.first = NULL;
}else
{
hashString.ConsumeChar( *it );
if( temp.first== NULL )
{
temp.first = &buffer[pInd];
}
buffer[pInd++] = *it++;
}
}
if( temp.first ){//如果文件末尾不是以\n结束的
buffer[pInd]=0;
temp.second = hashString.GetCurSum();
index.push_back( temp );
}
return true;
}
private:
char *buffer;
size_t length;
StringIndex index;
};
bool pr1( const StringIndex::value_type &l, const StringIndex::value_type &r )
{
if( l.second == r.second )
{
return (strcmp(l.first, r.first )<0);
}else
{
return l.second<r.second;
}
}
int main()
{
CreateStringIndex createIndex;
if( !createIndex.Create("test.txt") ){return 0;}
StringIndex &index = createIndex.GetStringIndex();
sort(index.begin(),index.end(),pr1);
index.erase(unique(index.begin(),index.end(),pr1),index.end());
for( StringIndex::iterator it = index.begin(); it!=index.end(); it++ ){
cout<<it->first<<endl;
}
return 0;
}
wishfly
2007-09-13
打赏
举报
回复
mark
加载更多回复(13)
C语言到
C++
过渡指南:掌握面向对象、STL与刷题技巧
编程语言的学习往往离不开指针、内存管理和数据结构等基础概念。C语言以面向过程为核心,开发者需要手动管理内存、处理字符串和数组,这类操作在工程实践中较为繁琐。
C++
作为C语言的扩展,在保留底层操控能力的同时,引入了类、封装、继承与多态等面向对象特性,并提供了标准模板库(STL)来简化容器、算法和迭代器的使用。理解虚函数、智能指针和拷贝控制等机制,有助于写出更安全、高效的代码。在在线评测平台(如PTA、GESP)刷题时,掌握字符串逆序、快速排序等常见题型的
C++
写法,能显著提升解题效率。无论是嵌入式开发、游戏引
C++
高级设计模式与系统架构:从代码到架构的思维跃迁
设计模式是软件工程中解决常见问题的可复用方案模板,其核心原理在于通过封装变化、解耦依赖来提升代码的灵活性和可维护性。在
C++
大型系统开发中,恰当运用设计模式的技术价值尤为显著,它能有效应对代码腐化、提升模块复用性,是构建健壮、可扩展系统的基石。从创建型模式如工厂方法和单例模式,到结构型模式如适配器和装饰器,再到
行
为型模式如策略和观察者,这些模式为管理对象生命周期、组合复杂结构和协调对象交互提供了系统化方法。在实际应用场景中,设计模式常与
C++
特有的泛型编程、模板元编程结合,通过编译期多态和策略模式等高级技术
从零搭建现代
C++
项目:CMake、VSCode与工程化实践指南
在软件开发中,构建系统是管理代码编译、链接和依赖的核心工具,它决定了项目的可维护性与跨平台能力。CMake作为业界事实标准,通过编写声明式的CMakeLists.txt脚本,能自动生成不同平台(如Makefile、Visual Studio项目)的原生构建文件,实现了“一次编写,到处构建”。其技术价值在于将开发者从繁琐的平台差异中解放出来,通过模块化的依赖查找(如find_package)和灵活的目标属性设置,大幅提升了
C++
项目的工程化水平。结合VSCode编辑器及其强大的CMake Tools、C/C+
C++
非递归二叉搜索树实现:从原理到工业级代码实践
二叉搜索树(BST)是一种基于节点与指针构建的经典数据结构,其核心原理是通过有序的二叉树结构实现高效的数据查找、插入与
删除
操作。在性能敏感的开发场景中,递归实现的BST可能因栈溢出风险与函数调用开销而受限,而非递归实现则通过循环与显式指针操作,提供了更稳定可控的性能表现。这种底层控制能力对于理解内存管理、指针操作以及构建更复杂的数据结构(如AVL树、红黑树)具有重要技术价值。在
C++
面试与系统级开发中,掌握非递归BST的实现是评估开发者对数据结构底层逻辑理解深度的重要标尺。本文将以
C++
模板化实现为例,深入
C++
std::set实战解析:有序集合背后的红黑树原理
C++
标准库中的关联容器按逻辑关系组织数据,其中std::set以红黑树实现,既保证元素有序唯一,又能在对数时间内完成插入、查找与
删除
。正是这种平衡树结构让开发者能在动态数据流中高效维护集合,实现去重排序、范围查询以及快速定位前驱后继,这也是set区别于vector和unordered_set的核心价值。然而实际工程中,自定义对象放入set时比较器的严格弱序要求常被忽视,容易导致等价误判、数据丢失等线上问题;容器选型也需要结合缓存友好度和节点分配开销,避免盲目使用。基于多种应用场景与代码审查经验,梳理std
其它技术问题
3,881
社区成员
9,044
社区内容
发帖
与我相关
我的任务
其它技术问题
C/C++ 其它技术问题
复制链接
扫一扫
分享
社区描述
C/C++ 其它技术问题
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章