2013-07-17 2 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으로 가능할 수도 있습니다. 당신이 모든 요소를 ​​통과 할 수 반복자 및 제거 요소처럼 각각의 작업을 수행 thsi 사용

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

it = myvector.begin();

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

를 사용하여 벡터에 대한 반복자를 얻을

+2

가장'경우 (위치 jogojapan

+0

새 항목을 삽입 하시겠습니까? 아니면 기존 값을 변경 하시겠습니까? – doctorlove

+0

인덱스가 설정되지 않았 으면 삽입하거나 먼저 설정 한 다음 인덱스를 삭제하고 새 값을이 위치에 저장합니다. – leon22

답변

0

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

'position'을 유효한 인덱스로 만들기 위해서는'reserve (position)'가 아니라'resize (position + 1)'이 필요합니다. –

+0

@MikeSeymour http://ideone.com/oh7Hf5 작동 중입니다. 귀하의 요점을 알 수는 없습니다. 왜냐하면 push_back과 당신이 논쟁하는 것을 볼 수 있지만, 우리는이 배열로 op가 무엇을 원하고 있는지 알지 못합니다. – Alexis

+0

"작동하지 않습니다". 코드가 벡터의 끝 부분을 넘어 서면 정의되지 않은 동작을 제공합니다. 이는 확실히 OP가 원하는 것이 아닙니다. 적어도 position + 1로 크기가 조정되지 않으면 position이 유효한 색인이 아닙니다. –

6

나는 질문은 분명하다 생각하지 않는다 삭제할 ​​수 있습니다. 원하는 경우

"먼저 삭제 한 다음 새 값을 설정하십시오."

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

당신은 정말 int positiontestVectorsize_type해야 작동 할 수 있습니다.

+0

+1은'size_type'을 불러옵니다. 물론'push_back'은'position'을 무시할 것입니다. 그것이 의도되었는지 확실하지 않습니다. – jogojapan

+0

@jogojapan re push_back ... 알아,하지만 "인덱스가 설정되지 않았다면 삽입하라"는 말은 아무 의미가있을 수 있습니다. – doctorlove

+0

물론입니다. 내 의견은 단지 질문자가 이것을 인식하도록하기위한 것입니다. – jogojapan

7

요구 사항은 질문에서 완전히 명확하지 않지만 testVector[position] == value으로 끝내기를 원합니다. position이 범위를 벗어 났는지 여부에 관계없이 가정합니다.

처음에는 너무 작 으면 벡터를 성장 시키십시오. 이미 존재하는 값 뒤에 0을 삽입합니다.

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

그런 다음 설정 할 요소 지정 : 당신은 텍스트에 설명 무엇

testVector[position] = value; 
+1

미안하지만 나는 이것을 downvote해야합니다. 'resize()'는 당신이 실제로 원하는 값으로 덮어 쓸 기본 요소를 삽입 할 것이다. 'push_back()'을 사용하는 것이 훨씬 낫다. – TemplateRex

+0

@TemplateRex :'push_back()'은 반드시 원하는 위치에 삽입하지 않아도된다. 이것은 OP가 원하는 것만 할 수있는 가장 간단한 방법입니다. 요소를 삽입하고 겹쳐 쓰는 비용을 정말로 피하고 싶을 때 대안을 추가 할 것입니다. 업데이트를 위해 –

+0

tnx! +1 now – TemplateRex

관련 문제