簡體   English   中英

C ++訪問向量

[英]C++ accessing vector

我有std::vector ,它包含我自己的類,我必須訪問它的功能和空隙。

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

您正在使用哪個編譯器? 我真的很驚訝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提供了您嘗試實現的那種容器初始化。

您發布的代碼仍然無法編譯(在第一個循環中未聲明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

運算符[]行為與矢量的at()函數非常相似,但它不“安全”,因為它不進行任何邊界檢查。 因此,如果您嘗試訪問3元素的4元素,則只需訪問內存中的某個隨機位置(例如,可以是另一個不相關的變量,可以是其他任何東西)。 如果幸運的話,您的程序將在此之后崩潰。 如果您不走運,則會遇到內存損壞問題和非常奇怪的錯誤,很難找到。

您的問題的解決方案是:

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

b)然后:在實際執行此向量查找時查看所有位置,並在每個位置停下來一秒鍾,然后考慮:“此向量此刻有多大?我確定該索引的元素存在嗎?”。

您可能會以這種方式快速找到錯誤。

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

我發現了問題。 它在功能上處理了矢量的大小。 顯然載體是空的。 愚蠢的錯誤。 謝謝大家的回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM