2009-11-03 6 views
3

기존 요소를 덮어 쓰지 않고 벡터의 가운데 (또는 다른 위치)에 요소를 삽입 할 수 있기를 원합니다.std :: vector 중간에 요소를 삽입하는 가장 쉬운 방법은 무엇입니까

내 벡터에 3 6 9 10이 있다고 말하고 6시 직후에 7을 삽입하고 싶습니다. 문제를 일으키지 않고 어떻게 처리해야합니까? 매우 드물게 작동하므로 효율성은 여기에서 문제가되지 않습니다. 또한이 시점에서 중간에 삽입에 좋은 다른 컨테이너 (예 : std :: list)로 전환 할 수 없습니다.

std::insert은 내가 원하는 것을 수행합니까? 방법?

감사합니다.

+1

위치의 뒤에 모든 요소를 ​​덮어 쓰지 않고 벡터의 "가운데"에 요소를 삽입 할 수 없습니다 새로운 요소를위한 공간을 남겨두기 위해 벡터의 끝에서 움직일 것입니다. 요소 n은 n + 1에 복사되고, 요소 n-1은 n 등에 복사되어 기존 요소를 덮어 씁니다. –

+1

물론 벡터에 대한 기존 반복자와 포인터가 무효화된다는 것을 의미합니다 (당연히 일반 old_push_back() 이후 일 수 있음). – ceo

답변

11

이 작업에는 vector::insert이 있습니다.

iterator insert(
    iterator _Where, 
    const Type& _Val 
); 
void insert(
    iterator _Where, 
    size_type _Count, 
    const Type& _Val 
); 
1

아마도 벡터의 삽입 멤버 함수를 사용하고 싶을 것입니다.

7

"6"다음에 '7'을 직접 삽입하는 예제를 편집했습니다. 이는 질문의 특정 위치에 벡터의 중심에 임의로 삽입하는 것에 관한 것입니다.

std::vector<int> v; 
v.push_back(3); 
v.push_back(6); 
v.push_back(9); 
v.push_back(10); 
std::vector<int>::iterator insert_pos = std::find(v.begin(), v.end(), 6); 
// only increment iterator if we've found the insertion point, 
// otherwise insert at the end of the vector 
if (insert_pos != v.end()) { 
    ++insert_pos; 
} 
v.insert(insert_pos, 7); 
// v now contains 3, 6, 7, 9, 10 
+0

삽입 할 색인을 찾을 '줄을 추가 할 수 있습니까? – Bill

+0

그래, 원래는 질문의 중간 부분에 초점을 맞추 었습니다. : – irh

1

마쉬의 예제 코드는 요점입니다 (단, 홀수 크기로 예상되는 위치에 삽입한다는 점에주의하십시오). 또한 효율성에 문제가 없다고하더라도 재 할당 및 숨겨진 복사를 피하기 위해 vector의 reserve() 멤버 함수를 사용하는 것이 좋습니다. (셔터 및 Alexandrescu의이 C, 말 기준 코딩 ++, "조기 pessimize하지 마십시오".)

2

모두 vector::findvector::insert를 사용하여, 위의 의견에 따라, 다음과 같은 코드를 제공합니다

std::vector<int> v; 
v.push_back(3); 
v.push_back(6); 
v.push_back(9); 
v.push_back(10); 
std::vector<int>::iterator pos = std::find(v.begin(),v.end(), 6); 
v.insert(pos, 7); 
+0

이것은 컴파일되지 않습니다 -'find'는'std :: vector'의 멤버가 아니며 연관 컨테이너. 삽입 점을 찾으려면 std :: find를 사용해야합니다. – irh

+1

죄송합니다, 커피 이전 답변. 대신 std :: find를 사용하도록 수정되었습니다. –

2

을 벡터가 정렬 된 경우 선형 검색을 피함으로써 삽입을 어느 정도 최적화 할 수 있습니다.

std::vector<int> v; 
v.push_back(3); 
v.push_back(6); 
v.push_back(9); 
v.push_back(10); 

std::insert(std::upper_bound(v.begin(), v.end(), 7), 7); 
+0

어쩌면 당신은 '#include '이 필요하다고 말했을 것입니다. 그러나 그것은 제가 원했던 것입니다, 감사합니다 +1. – Oriol

관련 문제