2010-11-22 80 views
2

我有std::vector它包含我自己的類,我必須訪問它的函數和空白。C++訪問向量

class A 
{ 
private: 
    int var; 
    vector<string> vec; 

public: 
    void setVar(int i) { var = i; } 
    void setVec(vector<string> a) { vec = a; } 
}; 

我也有返回功能,但我沒有打擾他們打字。我已經包含了所有必要的文件。

int main() 
{ 
    vector<A> vec; 
    for (int i = 0; i < 10; i++) 
    { 
     A tmp; 
     tmp.setVar(i); 
     vec.push_back(tmp); 
    } 

    for (int i = 0; i < 10; i++) 
    { 
     vector<string> tmp; 
     tmp.push_back("1"); 
     tmp.push_back("2"); 
     tmp.push_back("3"); 
     vec.at(i).setVec(tmp); //Works sometimes or causes error std::out_of_range 
     vec[i].setVec(tmp);  //Crashes the whole programm 
    } 
} 

那麼如何設置這些變量,因爲vector已初始化?

我使用g ++,這不是實際的代碼,因爲我的實際代碼很混亂。

Error for vec.at(i).setVec(tmp); 
Error is: terminate called after throwing an instance of 'std::out_of_range' 
    what(): vector::_M_range_check 
+0

這段代碼不會爲我編譯。你確定這裏`tmp`的設置是你的實際代碼嗎?當我解決這個問題時,要做一些有效的工作來在`vector`中設置3個`string`,這段代碼運行良好。 – 2010-11-22 15:45:56

+1

使用更新的代碼,我沒有看到任何理由,這應該失敗。您寫的代碼是否會爲您崩潰? – 2010-11-22 16:37:37

回答

2

您正在使用哪種編譯器?我其實很驚訝,即使編譯也是std::vector<std::string> tmp("1","2","3");

說實話,我不知道它會調用,但我敢打賭,它不會做你所期望的,我相信是:

std::vector<std::string> tmp; 
tmp.push_back("1"); 
tmp.push_back("2"); 
tmp.push_back("3"); 

爲了記錄在案,boost.assignC++0x提供了一種您試圖實現的容器初始化。

2

您發佈的代碼仍然無法編譯(在第一個循環中沒有tmp聲明),所以讓我來解釋一般會發生什麼。

有兩種你提到的錯誤:

vec.at(i).setVec(tmp); //Works sometimes or causes error std::out_of_range 

at嘗試是安全的功能 - 它首先檢查向量的長度,然後返回給定索引的元素,或者拋出std::out_of_range如果矢量不包含這種索引的元素。

第二種情況:

vec[i].setVec(tmp);  //Crashes the whole programm 

操作[]行爲很像0​​功能的載體,但它不是「安全」的,因爲它沒有做任何邊界檢查。因此,如果您嘗試訪問3元素的第4個元素,則只需訪問您內存中的某個隨機位置(可能是另一個無關的變量,例如可能是其他任何內容)。如果你很幸運,那麼你的程序會在那之後崩潰。如果你不走運,你會遇到內存損壞問題和很奇怪的錯誤,很難找到。

你的問題的解決方案是:

一)與vec.at(i)更換vec[i] - 工作一樣(當然,一點點慢,但你不會覺得),你是安全的。

b)然後:看看所有的地方,當你實際做這個矢量查找,並在每一個地方停下來,考慮:「這個矢量在這個時候有多大?我確定這個指數的元素存在?」。

你很可能以這種方式快速找到你的bug。

1

我在VS2010中試過你的代碼,無法重現你所描述的問題。當然,按值傳遞向量不是一個好主意,它應該是對常量的引用,但它不會導致這樣的錯誤。考慮到'std :: out_of_range'這個事實,最可能的原因是你的向量中沒有這樣的索引的元素。對於測試,您可以檢查訪問前是否i < vec.size()vec[i](或vec.at(i)

0

我發現問題。它是處理矢量大小的函數。顯然矢量是空的。愚蠢的錯誤。謝謝大家的回答。