V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  wevsty  ›  全部回复第 37 页 / 共 73 页
回复总数  1448
1 ... 33  34  35  36  37  38  39  40  41  42 ... 73  
2017-10-26 12:49:46 +08:00
回复了 scenix 创建的主题 C C++的 set 爆内存,求助
@scenix 跑了一下 O2 优化,0.18 秒。
然而写成这样子,真的很难看,基本丧失了复用性。
2017-10-25 19:06:04 +08:00
回复了 katsusan 创建的主题 Linux Linux 下 c 程序的内存问题
@katsusan 事实是可以的。这部分所谓的只读意思是,告诉你不能修改,但是如果你硬要修改是有办法的。毕竟代码同样会被加载到内存上而内存本来就是可读写的。

一般来说,下一条指令要执行的机器码错误多半是由于跳转的地址错误,调用函数实际上要执行 call 指令,而 call 指令是要把 IP ( X86 上是 EIP )寄存器存放到栈空间里的,如果函数里面错误的修改了栈空间里 IP ( EIP )的内容,那么在函数退出的时候 ret 指令就会把错误的值还原到 IP ( EIP ),这样你就会看到下一条执行的指令不正确了。
所以一般来说类似 delete 这种函数执行的时候如果出现这样的问题,多半是因为栈空间进行了错误的写入。仔细检查是否有越界的情况产生。
2017-10-25 18:23:45 +08:00
回复了 katsusan 创建的主题 Linux Linux 下 c 程序的内存问题
这种情况一般是程序其他地方溢出覆盖了不该覆盖的地方导致的。
2017-10-25 17:33:29 +08:00
回复了 scenix 创建的主题 C C++的 set 爆内存,求助
@wevsty
更正一下,字符串分割函数的 max_split 功能一不小心写错了,不过不影响这个例子中的运行结果。
//字符串分割
std::vector<string> string_split(const string &str_data,
const string &str_separator
, string::size_type n_max_split_count = (string::size_type) - 1)
{
std::vector<string> vec_split_str;
string str_subtmp;
string::size_type n_datalen = str_data.length();
string::size_type n_separator = str_separator.length();
string::size_type n_start = 0;
string::size_type n_index = 0;
do
{
if (n_max_split_count == 0)
{
break;
}
n_max_split_count--;
n_index = str_data.find(str_separator, n_start);
if (n_index != string::npos)
{
str_subtmp = str_data.substr(n_start, n_index - n_start);
if (str_subtmp.length() != 0)
{
vec_split_str.push_back(str_subtmp);
}
n_start = n_index + n_separator;
if (n_start >= n_datalen)
{
break;
}
}
else
{
str_subtmp = str_data.substr(n_start);
if (str_subtmp.length() != 0)
{
vec_split_str.push_back(str_subtmp);
}
break;
}
} while (n_index != string::npos);
return vec_split_str;
}
2017-10-25 15:51:16 +08:00
回复了 scenix 创建的主题 C C++的 set 爆内存,求助
#include <iostream>
#include <fstream>
#include <sstream>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <time.h>
#include <unordered_map>
#include <unordered_set>
using namespace std;

const string IN_FNAME = "/home/xubuntu/v2ex/test/test_py.txt";
unordered_map<string, unordered_set<string> > dict;

//字符串分割
std::vector<string> string_split(const string &str_data,
const string &str_separator
, string::size_type n_max_split_count = (string::size_type) - 1)
{
std::vector<string> vec_split_str;
string str_subtmp;
string::size_type n_datalen = str_data.length();
string::size_type n_separator = str_separator.length();
string::size_type n_start = 0;
string::size_type n_index = 0;
if (n_max_split_count == 0)
{
return vec_split_str;
}
do
{
if (n_max_split_count == 0)
{
n_max_split_count--;
break;
}
n_index = str_data.find(str_separator, n_start);
if (n_index != string::npos)
{
str_subtmp = str_data.substr(n_start, n_index - n_start);
if (str_subtmp.length() != 0)
{
vec_split_str.push_back(str_subtmp);
}
n_start = n_index + n_separator;
if (n_start >= n_datalen)
{
break;
}
}
else
{
str_subtmp = str_data.substr(n_start);
if (str_subtmp.length() != 0)
{
vec_split_str.push_back(str_subtmp);
}
break;
}
} while (n_index != string::npos);
return std::move(vec_split_str);
}

void read_message(const string& filepath)
{
fstream rin(filepath);
string buf;
string sep(" ");
std::vector<string> vec_list;
vec_list.reserve(20);
while (getline(rin, buf)) {
vec_list = string_split(buf, sep);
for (size_t i = 1; i < vec_list.size(); i++)
{
dict[vec_list[0]].insert(vec_list[i]);
}
vec_list.clear();
}
}

int main()
{
clock_t start = clock();
read_message(IN_FNAME);
clock_t end = clock();
cout << "time: " << ((double)end - (double)start) / CLOCKS_PER_SEC << " sec" << '\n';
cout << "Total Keys:" << dict.size() << '\n';
return 0;
}
2017-10-25 15:50:52 +08:00
回复了 scenix 创建的主题 C C++的 set 爆内存,求助
stringstream 的实现好像确实不是很快,所以我改了一下。
修改以后在 xubuntu 下面跑了一下,测试的数据是用图里 python 里写的 write_test_file 这个函数生成的。
[img]https://i.loli.net/2017/10/25/59f03fd257b2c.png[/img]
在 O2 优化下程序的时间是 0.267 秒,O3 优化的话和 O2 差不太多,python 下面则是 0.477 秒。
下一楼贴代码
2017-10-25 12:29:23 +08:00
回复了 scenix 创建的主题 C C++的 set 爆内存,求助
@scenix 速度的问题,上测试用例。对于测试用例 @williamscorn 的代码也未必就是速度最优的选择,剩下的具体问题具体分析。
2017-10-25 11:33:17 +08:00
回复了 scenix 创建的主题 C C++的 set 爆内存,求助
@williamscorn 按照我的理解,从楼主的意图来说,也许不应该用 std::set,而是用 std::list 或者 std::vector 更合适一些。
2017-10-25 11:24:56 +08:00
回复了 scenix 创建的主题 C C++的 set 爆内存,求助
这个 cpp 写的。。。
line.substr(start,end)这里的问题前面已经有人指出来了,end 不应该是结束为止的标号,而是复制的长度。
同理 end = line.size() - 1;一样是有问题的。
unordered_map<string, unordered_set<string>* > big_dict;
这个定义是一个 key 指向一个不会重复的 string 指针,big_dict[key]->insert(&value);实际是插入了 value 这个 string 的指针,然而 value 在循环结束的时候就因为生存周期结束而销毁了,所以你才觉得这样不会爆内存。

不要用那么多指针来掩饰,你程序里想表达的数据结构实际上就是:
unordered_map<string,unordered_set<string> >
在 map 里套 set,那么 key 至少存在 2 次,存在重复查找,重复存放一堆问题,效率能高才怪了
比如日志中某一行是
“ key value1 value2 ”那么运行完成以后数据结构实际上是
{'key':{'key':'value2'}}
而你的 python 代码对应的结果应该是
{'key':['value1','value2']}
从结果上看,不要谈效率,代码的实现完全都是不对的。
2017-10-25 10:41:16 +08:00
回复了 HunterMz 创建的主题 问与答 求助大陆和香港账户的转账问题
最好是楼主自己去开个香港银行卡,最好是和朋友同一家银行,这样朋友转给你就免费了。
如果都用工银亚洲的话,国内工行 atm 取款免费。
2017-10-24 20:00:08 +08:00
回复了 loser 创建的主题 阅读 求推荐给父母的科普书籍
中医是一个不可以证伪的东西,靠科普很难根除。
不建立科学思维,大概是很难理解这些的,与其期待改变,不如随他们去吧。
2017-10-23 21:47:55 +08:00
回复了 F2Sky 创建的主题 问与答 飞利浦的电动牙刷是不是没有原装的牙刷头了?
官方自营还不放心啥,和原装不一样就不一样呗,有些小改款也是很正常的。
2017-10-23 11:35:29 +08:00
回复了 dekira 创建的主题 C C++可以用变量定义数组了么
@nullcoder
不用太纠结字面的说法。
变长数组通常用来指代的是能直接用变量来定义数组的这种特性。
malloc 或者 new 出来的一个空间也可以当成数组用,这样也确实实现了变量来定义数组这种事实。
一定要纠结的话,可以理解为变长数组是用变量定义数组长度的一个子集。
2017-10-23 11:20:30 +08:00
回复了 dekira 创建的主题 C C++可以用变量定义数组了么
对 C 来说,C99 允许定义变长数组,然而有些编译器一直不肯支持(没错,说的就是你 MSVC )。
对 CPP 来说,变长数组这个特性标准上就没有支持,而且更 cpp 的做法是使用 vector 这样的 STL 容器。
2017-10-21 18:15:14 +08:00
回复了 longislet 创建的主题 Windows 两年前的 win10 要更新吗?
这种大版本升级最好直接重装,直接升容易有问题。
2017-10-20 17:19:51 +08:00
回复了 ballshapesdsd 创建的主题 问与答 c++内存泄露在程序退出之后还存在吗?
会的,这就是操作系统干的活
1 ... 33  34  35  36  37  38  39  40  41  42 ... 73  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5047 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 31ms · UTC 09:22 · PVG 17:22 · LAX 02:22 · JFK 05:22
Developed with CodeLauncher
♥ Do have faith in what you're doing.