2017-01-17 3 views
0

Я на самом деле пытаюсь реализовать простую копию std :: vector. Во время моих тестов, чтобы узнать, совместимы ли мои данные по сравнению с оригинальным, я заметил что-то.std :: векторный алгоритм изменения размера

std::vector<std::string> *v = new std::vector<std::string>(2); 
std::string str1("Hello"); 
std::string str2("World"); 

v->push_back(str1); 
v->push_back(str2); 

v->resize(5); 

for (std::vector<std::string>::const_iterator it = v->begin(); it != v->end(); it++) 
{ 
    std::cout << "/" << (*it) << "/" << std::endl; 
} 

вот результат:

// 
// 
/Hello/ 
/World/ 
// 

Может кто-нибудь объяснить мне, почему изменение размера не добавляет зЬй :: строку() 's, как это:

/Hello/ 
/World/ 
// 
// 
// 

Что такое алгоритм позади?

+0

Что вы видели, когда вы отлаживали свою программу в отладчике? – SergeyA

ответ

9

Ключ здесь:

std::vector<std::string> *v = new std::vector<std::string>(2); 

Это создает вектор с элементов, которые по умолчанию возведенных (то есть - две пустые строки). Затем вы push_backHello и World. Теперь у вас есть 4 элемента. Затем resize(5) добавляет еще один элемент (также построенный по умолчанию).

Я думаю, вы хотели манипулировать/увеличивать емкость? Вместо этого вам нужно std::vector::reserve.


Вы должны создать пустой вектор, а затем использовать push_back с, чтобы увидеть поведение, вы ожидаете. Или просто используйте operator[] вместо двух push_back s.


Есть ли веская причина для создания вектора на куче, а не на стеке? Вы (почти?) Всегда должны избегать этого.

+0

Большое вам спасибо, я просто не понял, как работает конструктор, я думал, что конструктор просто увеличивает емкость в этом случае. –

+1

@ ClémentJean - если вы хотите увеличить емкость, вам нужно 'std :: vector :: reserve'. –

+0

ok Я проверю и реализую его. спасибо за ваше время –

2

Вы строите std :: vector с 2 элементами внутри, по умолчанию сконструированы.
Ссылка: std::vector constructors

Заменить:

std::vector<std::string> *v = new std::vector<std::string>(2); 

с:

std::vector<std::string> *v = new std::vector<std::string>(); 

И, кстати, почему вы расПредеЛение вектор в куче с новым? Просто объявим его как:

std::vector<std::string> v; 
1

В конструкции вектора вы передали 2 в качестве аргумента. Если вы посмотрите на этой конструкции вы увидите следующее:

explicit vector(size_type _Count) 

Здесь вы создаете вектор с два по умолчанию построенной строки в нем, а затем нажать две другие строки в вектор. Используйте конструкцию по умолчанию, а затем используйте std::vector::reserve, чтобы увеличить емкость вектора.

2

Чтобы получить результат, который вы хотели видеть, попробуйте следующее:

std::vector<std::string> *v = new std::vector<std::string>({"s1","s2"}); 

Затем идти о вашем изменении размеров и зацикливание. Это должно дать вам ожидаемое дополнение, как вы предложили.

Смежные вопросы