作者WJAider (Aider)
看板Programming
标题Re: [问题] vector 没有数值
时间Fri Jan 6 22:03:58 2012
※ 引述《QQrzQQ (QQ)》之铭言:
: 大家好
: 最近第一次用到 vector 的方法
: 看网路上的用法 拿来使用做 matlab randperm 的函数
: 根据 matlab 的原函数 只是做出一连串的 rand number
: sorting 以後 再把 index 值读出来 ....
: void randperm(int *out, int n)
: {
: struct temp
: {
: int index;
: int rand_num;
: };
: struct temp_compare
: {
: bool operator() (temp i, temp j) {return (i.index<j.index);}
: } temp_compare_obj;
: // create memory
: temp *rand_temp = new temp[n];
: // generate random number with index
: for(int i=0; i<n; i++)
: {
: rand_temp[i].index = i;
: rand_temp[i].rand_num = rand();
: }
: vector<temp> vec_rand_temp (rand_temp, rand_temp+n); // ****
: sort(vec_rand_temp.begin(), vec_rand_temp.end(),temp_compare_obj); // ****
: for(int i=0; i<n; i++)
: out[i] = vec_rand_temp[i].index;
: delete rand_temp;
: }
: 其中 vec_rand_temp 里面居然都没有值!!!
: 想请教一下大概是甚麽样的问题
: 利用 pointer 如何把 阵列里的东西放进 vector 里面
: 这样的写法哪里错了呢?
: 谢谢大家~~
我猜是 C++ 吧?
我拿去编译唯一的问题是两个 struct 是 local 的
所以改成 global 就可以编译了
完整程式码:
#include<iostream>
#include<cstdlib>
#include<vector>
#include<algorithm>
using namespace std;
struct temp
{
int index;
int rand_num;
};
struct temp_compare
{
bool operator() (temp i, temp j) {return (i.index<j.index);}
};
void randperm(int *out, int n)
{
temp_compare temp_compare_obj;
// create memory
temp *rand_temp = new temp[n];
// generate random number with index
for(int i=0; i<n; i++)
{
rand_temp[i].index = i;
rand_temp[i].rand_num = rand();
}
vector<temp> vec_rand_temp (rand_temp, rand_temp+n); // ****
sort(vec_rand_temp.begin(), vec_rand_temp.end(),temp_compare_obj); //****
for(int i=0; i<n; i++)
out[i] = vec_rand_temp[i].index;
delete rand_temp;
}
int main(){
int test[5];
randperm( test, 5 );
for( int i=0 ; i<5 ; ++i ){
cout << test[i] << " ";
}
cout << endl;
return 0;
}
输出: 0 1 2 3 4
有成功存进 test 所以有东西
可是还是有若干问题
从必不可犯的开始吧
有个很大的错误是 delete
你 new 出一个阵列
就不应该用 delete 删它
而应该用 delete []
不然会只 delete 掉一格的位置
还有用 index 的大小来 sort 会发现顺序根本没变阿
所以原 po 似乎是想要用 rand_num 来 sort 吧?
那似乎就写反了
还有一个小事情就是你订了一个跟 pair<T, S> 一模一样的 struct
要是我就用 pair 代替了
typedef pair<int, int> temp;
还有 temp_compare_obj 只用一次通常也不会令出来,这就看个人习惯了啦
把上面这些问题处理过程式码长这样:
#include<iostream>
#include<cstdlib>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair< int, int > temp;
struct temp_compare
{
bool operator() (temp i, temp j) {return (i.second<j.second);}
};
void randperm(int *out, int n)
{
// create memory
temp *rand_temp = new temp[n];
// generate random number with index
for(int i=0; i<n; i++)
{
rand_temp[i].first = i;
rand_temp[i].second = rand();
}
vector<temp> vec_rand_temp (rand_temp, rand_temp+n); // ****
sort(vec_rand_temp.begin(), vec_rand_temp.end(),temp_compare()); //****
for(int i=0; i<n; i++)
out[i] = vec_rand_temp[i].first;
delete [] rand_temp;
}
int main(){
int test[5];
randperm( test, 5 );
for( int i=0 ; i<5 ; ++i ){
cout << test[i] << " ";
}
cout << endl;
return 0;
}
不过与其用 vector, 用 map 会不会比较方便?
欢迎讨论
以上
by Aider
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 182.235.46.73
1F:→ WJAider:忘了设 srand() ,请大家注意 182.235.46.73 01/06 22:05
2F:推 QQrzQQ:推一下 真的是rand_num和index弄反了.. 114.37.173.59 01/09 22:55
3F:→ QQrzQQ:另外请问一下 map的用法 大概是怎麽样阿? 114.37.173.59 01/09 22:55
4F:→ QQrzQQ:可以稍微说明一下吗? 114.37.173.59 01/09 22:55
5F:→ LifePattern:google stl map 114.32.247.244 01/10 22:53