关于字符串的一个思路求解

LBJMD 2011-07-06 09:08:36
问题是这样的,我先在有个初始值的字符串组,比如说是11.txt,12.txt。第二次假如我得到的字符串组是11.txt,12.txt,13.txt,14.txt。那么我想返回的是13.txt和14.txt。就是说和上次不同的字符串组。再假设第三次我得到的字符串组又发生了变化,比如变成了,12.txt,13.txt,14.txt,15.txt,那么这次要返回11.txt和15.txt。就是说每次都返回和上次不同的字符串。每次返回的字符串的个数不是固定的,而是只要和上次不同就返回,有几个返回几个,不知道我表达的是否清楚,请帮忙想个思路。
...全文
235 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanae 2011-07-08
  • 打赏
  • 举报
回复
其实 既然说到STL 为嘛不用next_permutation 然后取最后两个元素呢?
doudouchonga 2011-07-08
  • 打赏
  • 举报
回复
嗯、路过。看看
qingkongxiaoyang 2011-07-08
  • 打赏
  • 举报
回复
使用map吧。
将字符串作为key,通过find方法可以简单地判断是否已经在map中了。
基本思路如下,楼主还需要将常量字符串数组改为动态输入的即可。
#include <iostream>
#include <string>
#pragma warning (disable:4786)
#include <map>
using namespace std;

void main()
{
string str1[] = {"11.txt", "12.txt"};
string str2[] = {"11.txt", "12.txt", "13.txt", "14.txt"};
map<string, int> m_maps;
int len = sizeof(str1)/sizeof(string);
for(int i= 0; i<len; i++)
{
m_maps.insert(make_pair<string, int>(str1[i], 1));
}
map<string, int>::iterator iter;
cout<<"第二次与第一次不同的数据:"<<endl;
for(i = 0; i< sizeof(str2)/sizeof(string); i++)
{
iter = m_maps.find(str2[i]);
if( iter == m_maps.end() )
{
cout<<str2[i]<<endl;
}
}

m_maps.clear();
cout<<"第二次输入内容为:"<<endl;
for(i= 0; i<sizeof(str2)/sizeof(string); i++)
{
m_maps.insert(make_pair<string, int>(str2[i], 1));

}

for(iter = m_maps.begin(); iter != m_maps.end(); ++iter)
{
cout<<iter->first.c_str()<<endl;
}
}
Ace丶双鱼 2011-07-07
  • 打赏
  • 举报
回复
首先把第一个存在一个list里面
然后拿第二个和第一个对比,没有的话就被返回,得到你想要的结果。
再把第二个保存在list里面。。。
依次往后。。。
liurong14201024 2011-07-07
  • 打赏
  • 举报
回复
7楼简单,理解容易
至善者善之敌 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lbjmd 的回复:]
引用 14 楼 babilife 的回复:
看明白你要说什么了
是MFC?
把上一次数据放入set容器中s1
把当前的数据放入set容器中s2

然后std::set_difference():差集

SO~EASY

是MFC,还有这个std::set_difference():差集呢?我就想找个这样的函数去直接返回我想要的字符串。呵呵,多谢你啊,我在试试看。
[/Quote]


列子已经给你了,结贴吧
LBJMD 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 babilife 的回复:]
看明白你要说什么了
是MFC?
把上一次数据放入set容器中s1
把当前的数据放入set容器中s2

然后std::set_difference():差集

SO~EASY
[/Quote]
是MFC,还有这个std::set_difference():差集呢?我就想找个这样的函数去直接返回我想要的字符串。呵呵,多谢你啊,我在试试看。
至善者善之敌 2011-07-07
  • 打赏
  • 举报
回复

#include <algorithm>
#include <set>
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string a[] = {"11.txt","12.txt"}; //上一次的
string b[] = {"11.txt","12.txt","13.txt","14.txt"};//当前的

set<string> s1(a,a+2);
set<string> s2(b,b+4);

set<string>::iterator it;
set<string> sdifference;

std::set_difference(s2.begin(),s2.end(),s1.begin(),s1.end(),inserter(sdifference,sdifference.begin()));
for(it=sdifference.begin();it!=sdifference.end();it++)
{
cout << *it << endl;
}

}
至善者善之敌 2011-07-07
  • 打赏
  • 举报
回复
#include <algorithm>
#include <set>
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string a[] = {"11.txt","12.txt"}; //上一次的
string b[] = {"11.txt","12.txt","13.txt","14.txt"};//当前的

set<string> s1(a,a+2);
set<string> s2(b,b+4);

set<string>::iterator it;
set<string> sdifference;

std::set_difference(s2.begin(),s2.end(),s1.begin(),s1.end(),inserter(sdifference,sdifference.begin()));
for(it=sdifference.begin();it!=sdifference.end();it++)
{
cout << *it << endl;
}

}

至善者善之敌 2011-07-07
  • 打赏
  • 举报
回复
看明白你要说什么了
是MFC?
把上一次数据放入set容器中s1
把当前的数据放入set容器中s2

然后std::set_difference():差集

SO~EASY
5t4rk 2011-07-07
  • 打赏
  • 举报
回复
来看看
hedy007 2011-07-06
  • 打赏
  • 举报
回复
第一次
11.txt,12.txt,13.txt,14.txt

分配14个int
int *a=new int[14+1];
memset(a,0,14+1);
11.txt
则a[11]=1
14.txt
则a[14]=1
其它的像a[0],a[1],a[2]值都为0的嘛

第二次
9.txt,11.txt,12.txt,13.txt,14.txt,15.txt
9.txt
判断a[9]==1?"新字符串":"旧字符串";
11.txt
a[11]==1,旧字符串
LBJMD 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hedy007 的回复:]
如果后缀名固定,而文件名又全是整形数的话,
可以定义个大数组
11.txt
a[11]=1
...
16.txt
a[16]=1

新字符串查表即可
[/Quote]
不太理解你的意思,能否说的详细一点
hedy007 2011-07-06
  • 打赏
  • 举报
回复
如果后缀名固定,而文件名又全是整形数的话,
可以定义个大数组
11.txt
a[11]=1
...
16.txt
a[16]=1

新字符串查表即可
LBJMD 2011-07-06
  • 打赏
  • 举报
回复
好的,多谢楼上两位。
c_losed 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lbjmd 的回复:]

引用 2 楼 c_losed 的回复:
专门放一个ini文件 存放上次的内容
然后第二次的时候 跟存放的进行对比
如果相同则跳过
不同则返回

这个思路我不太方便用,因为我想直接在程序里去通过一个算法去实现。专门再写个文件,可能有点绕路了。
[/Quote]
那就用7楼思路吧 可行
贪食蛇男 2011-07-06
  • 打赏
  • 举报
回复
如果不追求效率的话,就简单的很了。
1. 第一次次初始化一个 list,把该 list 标记为当前列表。
2. 下次接受一组字串时,初始化两个 list,第一个 list放入全部的字串,记做列表a,第二个放入和当前列表不同的字串,记做列表b。这一组字串输入完毕时,b即是和上次不同的。然后把 a标记成当前列表.
3. 重复2
LBJMD 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 healer_kx 的回复:]
真的没懂,要不你再抽象一点。
[/Quote]
额,这个可能我表达能力有限吧,就是每次返回跟上次存储的不同的字符串变量。
LBJMD 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 c_losed 的回复:]
专门放一个ini文件 存放上次的内容
然后第二次的时候 跟存放的进行对比
如果相同则跳过
不同则返回
[/Quote]
这个思路我不太方便用,因为我想直接在程序里去通过一个算法去实现。专门再写个文件,可能有点绕路了。
贪食蛇男 2011-07-06
  • 打赏
  • 举报
回复
set<>
加载更多回复(3)

64,663

社区成员

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

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