2017-10-10 4 views
0

의 벡터에 새로운 요소를 추가 할 때 기본이 아닌 생성자를 사용하여, 나는이 같은 다른 클래스에서 객체의 벡터를 가지고 :<class> 객체 클래스에서

class Foo { 
private: 
    std::vector<Bar> barObject; 
... 
}; 

클래스 바 기본 정의 생성자 (모든 전용 변수는 제로로 초기화) 한 값과,에 공급 될 수있는 비 기본 생성자 :

클래스에 foo
Bar newBar(var1, var2); 

상기 barObject 벡터는 크기를 지정하지 않고 선언된다. 나는 기본 생성자를 사용하려면 내가 추측하고있어

, 나는 다만 수 :

barObject.resize(barObject.size()+1); 

그리고 다음과 같은 벡터 뭔가 barObject 난의 개인 변수를 변경 :

barObject.at(i).SetVar(value) 

하지만 기본값이 아닌 생성자를 사용하고 개인 변수의 값을 입력하려면 다음과 같이 할 수 있습니까?

tempBar는 barObject의 위치 i에 원하는 private 값을 가진 Bar 클래스의 객체입니까?

void resize (size_type n, const value_type& val);

이것은 당신이 새로 할당 된 메모리의 값을 지정할 수 있습니다 :

+0

너무 작은 코드가 산문을 동반. 할 수있는 한 [mcve]만큼을 만드십시오. – Yunnosch

+0

@Yunnosch 많은 코드! = 더 좋은 질문입니다. 항상 흑백이 아닙니다. – Rakete1111

+2

@ Rakete1111 사실이지만 코드를 설명하면 (유용하지만) 코드를 보여줌으로써 멋지게 표현할 수 있습니다. – Yunnosch

답변

2

resize는 과부하가 있습니다. 그러나 벡터를 구성의 일부로 할당하려는 경우에도이를 수행 할 수 있습니다.

vector (size_type n, const value_type& val, 
     const allocator_type& alloc = allocator_type()); 

을 그럼 당신이해야 할 일은 한 번만 벡터를 구성하는 균일 초기화 구문을 사용하는 것입니다 : : 벡터이 할 수있는 생성자가

class Foo { 
public: 
    Foo() : barObject(17, Bar(4, 5)) {} // Creates a 17 length array 
}; 

그냥 사용하려는 경우 당신이 이미 vector 건설 그 끝에 요소를 추가하면 push_back 또는 emplace_back을 사용할 수 있습니다. 당신이 삽입 위치에 반복자를 만들 필요 해요 인서트를 사용하려면

:

당신이 사용할 수있는 벡터 내의 값 중 하나 at() 기능 또는 변경하기 위해
auto myIt = barObject.begin() + 3; 
myIt = barObject.insert(myIt, 5, Bar(6, 7)); // Inserts 5 objects at offset 3, and increases its size by 5. 
myIt += 6; 
myIt = barObject.insert(myIt, Bar(8, 7)); // Inserts 1 object at offset 9 (not offset 14), and increases its size by 1. 

operator[] 기능 :

barObject.at(3) = Bar(4, 5); 
barObject[3] = Bar(4, 5); 

둘 사이의 차이가 경계 .at() 검사를 수행한다. 반면 operator[]은 그렇지 않습니다.

-1

질문에 대한 답변.예, 삽입 그런 종류의 작업을 수행 할 수 있습니다

barObject.insert(i, tempBar); 

그냥 i이 유효 하나되어 있는지 반복자합니다

std::vector<Bar>::iterator i = barObject.begin(); 
barObject.insert(i, tempBar); 
+1

@Mooing Duck vector :: insert는 반복자를 사용합니다. – StahlRat

관련 문제