2014-02-08 3 views
0

Я пытаюсь получить последний определенный элемент в векторе C++, но как вектор :: емкость, так и вектор :: размер просто дают мне максимальный размер. Например:Найти последний заданный элемент в Vector C++

int main() { 
    char* array = new char[MAX_SIZE]; //MAX_SIZE is a const int equaling 100 
    std::cout << "Enter in a number: "; 
    std::cin >> array; 
    std::vector<char> cVector; 
    cVector.reserve(MAX_SIZE); 
    cVector.assign(array, array + MAX_SIZE); 
    for (std::vector<char>::const_iterator i = cVector.begin(); i != cVector.end(); ++i) 
    { 
      std::cout << *i; 
    } 
    std::cout << std::endl; 
    std::cout << "Size: " << cVector.size() << std::endl; 
    std::cout << "Actual size: " << cVector.capacity() << std::endl; 
} 

Примера вывод:

Enter in a number: 55 
55 
Size: 100 
Actual size: 100 [Should say 2] 

Я попытался с помощью вектора :: конца() и аналогичных методов, но нет никакого способа для меня, чтобы получить индекс последнего элемента.

+0

код делает то, что он должен делать. Что вы подразумеваете под последним определенным элементом? Вы строите 'cVector' с размером' MAX_SIZE'. И почему бы вам просто не использовать 'std :: string'? –

+0

Приношу свои извинения. Первоначально я использовал динамический массив и определил его заполнение, но позже изменил его на обычный массив. Я исправлю это сейчас. – user3288091

+1

Зачем нужен фактический размер 2? – smac89

ответ

2

Когда вы звоните reserve(MAX_SIZE), вы меняете емкость, поэтому выход 100 - это то, что должно быть. Этот цикл, в котором вы печатаете значения, фактически выполняет итерацию все 100 раз, но все остальные символы - \0, поэтому std::cout интерпретирует эти указатели как пустые строки. Вот немного модифицированная версия, которая создает правильный вектор, поэтому vector.back() будет указывать на последний элемент и vector.end() на следующую позицию в памяти.

int main() { 
    std::string s; 
    std::cout << "Enter in a number: "; 
    std::cin >> s; 
    std::vector<char> cVector; 
    cVector.reserve(MAX_SIZE); 
    cVector.assign(&s[0], &s[0]+s.size()); 
    for (std::vector<char>::const_iterator i = cVector.begin(); 
     i != cVector.end(); ++i) 
    { 
     std::cout << *i; 
    } 
    std::cout << std::endl; 
    std::cout << "Size: " << cVector.size() << std::endl; 
    std::cout << "Actual size: " << cVector.capacity() << std::endl; 
} 

UPDATE: Обратите внимание, что я использовал std::string только, чтобы сделать его более C++ - иш. Вы можете продолжать использовать char[], просто вам нужно заменить свое первоначальное назначение на:

cVector.assign(array, array + strlen(array)); 
+0

Это прекрасно! Спасибо огромное! Странно, что заполнение вектора с помощью массива char не работает, но делает это с помощью строки. – user3288091

+0

@ пользователь3288091 извините за это путаницу. Это также будет работать с 'char []', см. Обновление. – bereal

1

size() дает длину вектора (количество элементов на самом деле в нем, а не количество элементов, которое оно может в настоящее время подходит). Вы видите тот же номер, потому что вы назовете assign(array, array + MAX_SIZE) на вектор, который, очевидно, заполнит его MAX_SIZE элементов.

+0

Есть ли лучший способ для меня добавить содержимое массива в вектор? – user3288091

+0

Этот код всего 5 строк, если вместо этого вы используете 'string'. Если вы настаиваете на использовании массива, замените 'MAX_SIZE' на длину« string »в массиве char. – Thomas

+0

Верно, я думаю, это лучший случай. Спасибо за помощь. – user3288091

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