2011-05-10 74 views
0

問題在於塊內:變量在此範圍內沒有聲明

check_sort(l.begin(), l.end(), "list"); 
time_insert(insert_list, data); 
check_sort(s.begin(), s.end(), "set"); 
time_insert(insert_set, data); 
check_sort(v.begin(), v.end(), "vector"); 
time_insert(insert_vector, data); 

該錯誤提示中的變量不是在範圍內聲明的,但不應L,S,V是普遍的變量在這裏?我究竟做錯了什麼。

#include <cmath> 
#include <iterator> 
#include <iostream> 
#include <iomanip> 
#include <vector> 
#include <ctime> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <cstdlib> 

using namespace std; 

typedef void Inserter(vector<double>); 

vector<double> gen_data(int num_elts); 
void insert_list(vector<double> data); 
void insert_set(vector<double> data); 
void insert_vector(vector<double> data); 

void time_insert(Inserter inserter, vector<double> data); 

template <class Iter> bool is_sorted(Iter first, Iter last); 
template <class Iter> void check_sort(Iter first, Iter last, string cont_kind); 

int main() { 
    srand(time(0));// initialize random number generator 
    cout << "How many elements for container? "; 
    int num_elts = 0; 

    while (cin >> num_elts) { 
    if (num_elts <= 0) 
     cout << "Error, should be > 1"; 
    else { 
     vector<double> data = gen_data(num_elts); 

     check_sort(l.begin(), l.end(), "list"); 
     time_insert(insert_list, data); 
     check_sort(s.begin(), s.end(), "set"); 
     time_insert(insert_set, data); 
     check_sort(v.begin(), v.end(), "vector"); 
     time_insert(insert_vector, data); 

    } 
    cout << "\nHow many elements for next container? "; 

    } 
    return 0; 

} 
void time_insert(Inserter inserter, vector<double> data) { 
    clock_t t1 = clock(); 
    if (t1 == clock_t(-1)) { //if clock() doesn’t work 
    cerr << "sorry, no clock\n"; 
    exit(1); 
    } 

    inserter(data); 
    clock_t t2 = clock(); 
    if (t2 == clock_t(-1)) { 
    cerr << "sorry, clock overflow\n"; 

    exit(2); 
    } 

    cout << "Elapsed time: " << fixed << setprecision(2) 
    << double(t2-t1)/CLOCKS_PER_SEC << " seconds\n"; 

} 

class Larger_than { 
    double v; 
public: 
    Larger_than(double vv) : v(vv){} 
    bool operator()(double x) const {return x>v;} 
}; 

// Sorts and then inserts data into a list 
void insert_list(vector<double> data) 
{ 
    list<double> l; 
    for(int i=0; i < data.size(); i++){ 
    list<double>::iterator p = find_if(l.begin(),l.end(), Larger_than(data[i])); 
    l.insert(p, data[i]); 
    } 
} 
// Sorts and then inserts data into a list 
void insert_set(vector<double> data) 
{ 
    set<double> s; 
    for(int i=0; i < data.size(); i++){ 
    set<double>::iterator p = find_if(s.begin(),s.end(), Larger_than(data[i] 
         )); 
    s.insert(p, data[i]); 
    } 
} 
// Sorts and then inserts data into a list 
void insert_vector(vector<double> data) 
{ 
    vector<double> v; 
    for(int i=0; i < data.size(); i++){ 
    vector<double>::iterator p = find_if(v.begin(),v.end(), Larger_than(data 
             [i])); 
    v.insert(p, data[i]); 
    } 
} 

// generate num_elts random numbers in the range [0.0, 1.0), 
// which are returned in a vector 

vector<double> gen_data (int num_elts) 
{ 
    vector<double> result; 
    for (int i = 0; i < num_elts; i++) { 
    double datum = 1.0*rand()/RAND_MAX; 
    result.push_back(datum); 
    } 
    return result; 
} 

// is container spanned by [from, last) sorted? 
template <class Iter> bool is_sorted(Iter first, Iter last) 
{ 
    Iter next = first;     // next element 
    for (next++; next != last; next++, first++) { 
    if (*first > *next) 
     return false; 
    } 
    return true; 
} 

// prints a msg describing container kind, as well as whether container 
// spanned by [from, last) is sorted 
template <class Iter> void check_sort(Iter first, Iter last, string cont_kind) 
{ 
    cout << "Check: " << cont_kind << " is "; 
    if (!is_sorted(first, last)) cout << "not "; 
    cout << "sorted\n"; 
} 
+0

l','s'和'v'是你聲明它們的函數中的棧變量。它們不在這些功能的範圍之外。 – 2011-05-10 02:14:01

+0

「這裏不應該是l,s,v是通用變量嗎?」不,我甚至不知道爲什麼你會期待他們。 – 2011-05-10 04:58:13

回答

0

您似乎沒有聲明變量。你爲什麼認爲它們應該存在於主體中?我可以看到任何地方都沒有這些名字的全局或本地人。在使用它們之前嘗試聲明它們。

+0

在'insert_xxx'函數中有本地人。 – Xeo 2011-05-10 02:12:36

+0

@Xeo:函數中的局部變量在main中不可見。你需要讓本地人成爲主人,或者讓他們成爲全球人。 – 2011-05-10 12:42:03

+0

嗯,是的,我知道...閱讀我的答案。 – Xeo 2011-05-10 12:46:38

2

main應該怎麼知道s,lv呢?它們是完全不相關的函數的局部變量(insert_xxx),因此main無法知道它們。如果你想使他們在全球訪問的,只是讓他們的全局變量,即把自己定義main前:

// ... 

list<double> l; 
set<double> s; 
vector<double> v; 

int main(){ 
    // .... 
} 

// ... 
+0

當然,這也不好。 :) – GManNickG 2011-05-10 02:14:56

+0

嗯,是的。 ; P但它至少適用於他/她想要做的事情。當然,我可以整天談論依賴注入,但是...讓我們保持簡單,不是嗎? – Xeo 2011-05-10 02:15:38

1

它看起來像L是在「insert_list」功能定義,也不會在主用。只有在你的函數中定義的變量可用。