2013-03-23 110 views
-1

讓我們拿這個代碼爲例: 我想使用字符串「name」作爲我在for循環中使用的數組的名稱,但是我卻接收到字符串「array」。如何使用這個字符串作爲我的數組的名稱?For循環中的數組?

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    int array[3]; 
    array[0] = 1; 
    array[1] = 2; 
    array[2] = 3; 
    string name = "array"; 
    int i; 
    for (i = 0; i < 3; i++) { 
    cout << name[i] << endl; 
    } 
} 
+1

這段代碼甚至不會接近編譯,在你嘗試了一些難度後再回到我們。 – 2013-03-23 12:44:20

+4

C++沒有反射 - 沒有通用的方法來使用包含其標識符的字符串來引用變量(或其他)。 – Angew 2013-03-23 12:45:06

+1

如果您嘗試將值與某個鍵關聯,則可以使用地圖。否則,你想在這裏是不可能的。 – Aleks 2013-03-23 12:46:40

回答

5

將我的評論展開爲答案。

C++沒有反射:沒有通用的方法來使用包含其標識符的字符串引用變量(或其他)。

但是,有數據結構可用於基於密鑰(如字符串)檢索數據。在你的情況下,你可以做這樣的事情:

#include <iostream> 
#include <map> 
#include <string> 
#include <vector> 

int main() { 
    std::map<std::string, std::vector<int> > allArrays; // mapping strings to vectors of ints 
    allArrays["array"].push_back(1); // fill vector stored under key "array" 
    allArrays["array"].push_back(2); 
    allArrays["array"].push_back(3); 

    // another way: 
    std::vector<int> &vec = allArrays["another_array"]; 
    vec.push_back(-1); 
    vec.push_back(-2); 
    vec.push_back(-3); 

    std::string name = "array"; 

    for (size_t i = 0; i < allArrays[name].size(); ++i) { 
    std::cout << allArrays[name][i] << '\n'; //not using endl - no need to flush after every line 
    } 
} 
+0

爲什麼我們不需要在線後沖洗? – 0x499602D2 2013-03-23 13:39:03

+0

@David問題反過來說:爲什麼我們需要?如果我們不這樣做,我們不應該做額外的工作,而是會顯着減慢運行速度。我只是試圖糾正錯誤的觀念,「<< endl'是將一個換行符放在'std :: ostream'中的默認方式。不是;它意味着「放一個換行符並沖洗流」。當main()結束時,這個示例程序將被刷新。在更大的程序中,在整個輸出之後進行刷新可能會更好 - 它的速度肯定會快得多。 – Angew 2013-03-23 14:03:53