[英]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.assign和C ++ 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.