2013-07-17 127 views
4

我需要對我的std::vector進行索引訪問,因此我必須檢查一個索引是否已經可用,先刪除它們,然後設置一個新值。檢查一個給定的索引是否存在於std :: vector

這是我的setter函數:

void SetVector(int position, int value) { 
    std::vector<int>iterator it = testVector.begin(); 
    // need a check here 
    testVector.insert(it-testVector.begin()+position, value); 
} 

或者這是我的需要了錯誤的C++收集? (應該動態增長,所以沒有std:array可能)。可以使用std::map,但也可以使用std::vector

+2

你在文中描述什麼最能說'如果(位置 jogojapan

+0

是否要插入新項目或更改現有值? – doctorlove

+0

如果沒有設置索引或者如果設置了,請先刪除它並在此位置保存新值! – leon22

回答

0

首先使用

std::vector<int>::iterator it; 

it = myvector.begin();

for (it=myvector.begin(); it<myvector.end(); it++) 
    std::cout << ' ' << *it; 

使用thsi迭代器可以遍歷所有元素,並像remove元素進行相應的操作讓你的向量迭代器

1

您可以使用std::vector::at如果您在此索引中沒有任何內容,他們會拋出異常。

功能自動檢查n是否在矢量 有效元素的範圍內,拋出異常out_of_range如果 不是(即,如果n是大於或小於其大小相等)。這與 與成員運算符[]不同,它不檢查邊界。

既然你給定索引處獲取對象上的參考,您可以更改/刪除值

void SetVector(int position, int value) { 
    try 
    { 
     testVector.at(position) = value; 
    } 
    catch (const std::out_of_range& oor) { 
     testVector.resize(position + 1); 
     testVector[position] = value; 
    } 
} 
+1

您需要'調整大小(位置+ 1)',而不是'保留(位置)',以使'位置'成爲一個有效的索引。 –

+0

@MikeSeymour http://ideone.com/oh7Hf5它的工作,我沒有明白你的觀點。因爲我看到你用push_back和所有的東西爭論,但我們真的不知道自己想用這個數組做什麼 – Alexis

+0

這不是「工作」。你的代碼超出了vector的末尾,給出了未定義的行爲 - 這當然不是OP想要的。除非調整到至少「位置+1」,否則「位置」不是有效索引。 –

6

我不相信這個問題是清楚的。如果你想

「首先刪除它們,然後設置一個新值。」

這可能工作

void SetVector(int position, int value) { 
    if (position < testVector.size()) { 
     testVector[position] = value; 
    } 
    else { 
     testVector.push_back(value); 
    } 
} 

你真的應該讓int positiontestVectorsize_type

+0

用於調出'size_type'的+1。 'push_back'當然會忽略'position'。不知道這是否是有意的。 – jogojapan

+0

@jogojapan re push_back ...我知道,但評論說「插入索引沒有設置」這可能意味着什麼。 – doctorlove

+0

當然。我的評論只是爲了讓提問者意識到這一點。 – jogojapan

7

這個問題的要求並不完全清楚,但是我假設你想以testVector[position] == value結束,不管position是否在範圍之內。

首先增長矢量,如果它太小。這會在任何已經存在的地方插入零值。

if (position >= testVector.size()) { 
    testVector.resize(position+1); 
} 

然後指定你要設置的元素:

testVector[position] = value; 
+1

對不起,但我不得不冷靜下來。 'resize()'會插入一個默認元素,然後用你實際需要的值覆蓋它。使用'push_back()'更好。 – TemplateRex

+0

@TemplateRex:'push_back()'不一定會將它插入到期望的位置,所以這將是錯誤的。這是完成OP似乎想要的最簡單的方法;當你真的想避免插入和覆蓋元素的成本時,我會添加一個替代方案。 –

+0

tnx更新! +1 now – TemplateRex

相關問題