Форум программистов, компьютерный форум CyberForum.ru

std::vector - C++

Восстановить пароль Регистрация
 
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
07.03.2013, 11:08     std::vector #1
Здравствуйте! Подскажите пожалуйста разумно-ли использовать
C++
1
std::vector
если у меня в векторе может храниться довольно большое кол-во записей (я с таким кол-вом пока что не сталкивался) от 5к+ (думаю может доходить и до всех 50к+).

Так как я раньше не сталкивался с векторами возник такой вопрос.
Можно ли как-то по итератору получить доступ к переменной хранящейся в векторе не выталкивая его из вектора и не создавая доп. переменных?
Т.е. что-то типа:
C++
1
*it.z;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2013, 11:08     std::vector
Посмотрите здесь:

std::vector<char**> C++
C++ std::vector и деструкторы
std::vector::erase C++
Вывести значения std::vector<std::vector<int*> > C++
std::vector пустой C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11840 / 6819 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
07.03.2013, 11:25     std::vector #2
А что Вы хотите использовать вместо вектора? Если конечное число элементов известно, то можно сделать обычный массив, если не известно, то писать все ручками, либо как раз юзать вектор.

А как Вы "выталкивать" элемент собрались? Это же не стэк в конце то концов. По сути итератор это обертка над указателем на элемент. Так же в векторе есть оператор индексации для прямого доступа к элементу и метод at для "безопасного" доступа.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.03.2013, 11:26     std::vector #3
1) Вполне, лишь бы памяти хватило.
2)
Цитата Сообщение от PakistanCode Посмотреть сообщение
Можно ли как-то по итератору получить доступ к переменной хранящейся в векторе не выталкивая его из вектора и не создавая доп. переменных?
Можно:
C++
1
2
3
vector <int> vec;
vec.push_back(50);
*vec.begin() += 100;
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
07.03.2013, 15:00     std::vector #4
Цитата Сообщение от PakistanCode Посмотреть сообщение
C++
1
*it.z;
как я понял что в векторе ты собираешься хранить объекты какого то класса?, если так то его стоит снабдить конструктором копирования и, желательно точнее знать максимальное кол-во элементов в векторе, иначе при добавлении и не хватке памяти будет перекопирование всех остальных элементов, на что будет уходить время, т.е создать в начале вектор определенного размера
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.03.2013, 15:47     std::vector #5
Цитата Сообщение от aLarman Посмотреть сообщение
его стоит снабдить конструктором копирования
Конструктор копии и оператор присваивания нужен только в том случае, если в классе используются какие-то ресурсы, копирование которых является нетривиальной задачей (т.е. для которых не подходит предоставленный компилятором вариант копирования). И в этом случае два этих элемента необходимы для корректной работы класса вообще, и никак не связаны с использование std::vector. Класс же наподобие такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Foo
{
public:
    Foo(int foo = 0):
        m_foo(foo)
    {
    }
    
    int get_foo() const
    {
        return m_foo;
    }
    
    void set_foo(int foo)
    {
        m_foo = foo;
    }
    
private;
    int m_foo;
};
можно использовать с std::vector, не описывая конструктор копии явно, хватит и предоставленного компилятором.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.03.2013, 16:10     std::vector #6
Цитата Сообщение от silent_1991 Посмотреть сообщение
Конструктор копии и оператор присваивания нужен только в том случае, если в классе используются какие-то ресурсы, копирование которых является нетривиальной задачей
я ж не Ванга, что бы знать какие у него будут данные(указатели по которым буду выделять память или переменные встроенных типов), поэтому чтобы не делать ошибок и разбираться пару недель "а почему у меня криво копирует?" предлагаю это делать(писать констркутор копий)
silent_1991
11.03.2013, 16:17
  #7

Не по теме:

Цитата Сообщение от aLarman Посмотреть сообщение
поэтому чтобы не делать ошибок и разбираться пару недель "а почему у меня криво копирует?" предлагаю это делать(писать констркутор копий)
Всё упирается в знание и понимание основ. Я сторонник того, чтобы объяснить человеку, для чего нужно делать те или иные манипуляции, и предоставить ему решать, нужны они в данном конкретном случае или нет, вместо того, чтобы сказать "тут надо делать так", и хоть трава не расти. К сожалению, чаще применяется второй вариант, в результате чего вырастают программисты, которые в начало каждого файла с исходными кодами (и даже заголовочного файла) пишут using namespace std;, при этом даже не понимая, для чего они это делают.

aLarman
11.03.2013, 16:27
  #8

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
"тут надо делать так"
Цитата Сообщение от aLarman Посмотреть сообщение
его стоит снабдить конструктором копирования
это совет, а не обязательные действия

diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.03.2013, 16:29     std::vector #9
Цитата Сообщение от PakistanCode Посмотреть сообщение
50к+
Ну, и?
Я бы еще понял, если бы хотя бы 100 мегабайт набиралось...
Мне вот недавно нужен был массив на 4 гига - статические массивы не компилятся, выделение памяти через new кидает исключение, malloc возвращает NULL... А вектор спокойно отработал (действие происходило в студии).
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.03.2013, 16:33     std::vector #10
Цитата Сообщение от diagon Посмотреть сообщение
Мне вот недавно нужен был массив на 4 гига - статические массивы не компилятся, выделение памяти через new кидает исключение, malloc возвращает NULL... А вектор спокойно отработал (действие происходило в студии).
у меня на 100кк элементов вектор вылетает с исключением как то странно 100кк элементов это еще тока <100Мб
Avazart
 Аватар для Avazart
6903 / 5143 / 253
Регистрация: 10.12.2010
Сообщений: 22,615
Записей в блоге: 17
11.03.2013, 17:53     std::vector #11
Цитата Сообщение от diagon Посмотреть сообщение
Мне вот недавно нужен был массив на 4 гига - статические массивы не компилятся, выделение памяти через new кидает исключение, malloc возвращает NULL... А вектор спокойно отработал (действие происходило в студии).
А как такое возможно ? У вектора тот же массив внутри, а если такого куска памяти нет - то откуда ему взяться ?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.03.2013, 18:00     std::vector #12
Цитата Сообщение от Avazart Посмотреть сообщение
А как такое возможно ? У вектора тот же массив внутри, а если такого куска памяти нет - то откуда ему взяться ?
Ну, возможно, если вектор превышает некую планку, то он распиливается на куски. Вникать мне было лень, там для инициализации вектора какие-то функции со страшными именами используются. Да и в принципе, я не понимаю, почему нельзя создать массив в 4 гигабайта на 64битной ос, когда доступно больше 6 гигабайт (впрочем, в этом вопросе я не разбираюсь).
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.03.2013, 18:01     std::vector #13
Цитата Сообщение от diagon Посмотреть сообщение
Да и в принципе, я не понимаю, почему нельзя создать массив в 4 гигабайта на 64битной ос, когда доступно больше 6 гигабайт.
если ничего не путаю, есть определенный размер для одного процесса, видимо по этой причине
Avazart
 Аватар для Avazart
6903 / 5143 / 253
Регистрация: 10.12.2010
Сообщений: 22,615
Записей в блоге: 17
11.03.2013, 18:06     std::vector #14
Цитата Сообщение от diagon Посмотреть сообщение
Ну, возможно, если вектор превышает некую планку, то он распиливается на куски.
Ну так это противоречит стандарту вроде.

Цитата Сообщение от diagon Посмотреть сообщение
Да и в принципе, я не понимаю, почему нельзя создать массив в 4 гигабайта на 64битной ос, когда доступно больше 6 гигабайт (впрочем, в этом вопросе я не разбираюсь).
По тому что 6Г могут быть "не сплошными" а нужен именно сплошным куском, более того что-то ведь занято другими процессами.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.03.2013, 18:13     std::vector #15
Цитата Сообщение от aLarman Посмотреть сообщение
если ничего не путаю, есть определенный размер для одного процесса, видимо по этой причине
Ну так с вектором-то все ок.

Кстати, со студией я наврал - у меня тогда был интеловский компилятор(интегрированный в студию). А студийный компилятор таки выделяет нужный кусок памяти.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2013, 18:20     std::vector
Еще ссылки по теме:

C++ Std::vector
C++ Контейнер std::vector
Как изменять размер std::vector<std::vector>? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6903 / 5143 / 253
Регистрация: 10.12.2010
Сообщений: 22,615
Записей в блоге: 17
11.03.2013, 18:20     std::vector #16
Цитата Сообщение от diagon Посмотреть сообщение
Кстати, со студией я наврал - у меня тогда был интеловский компилятор(интегрированный в студию). А студийный компилятор таки выделяет нужный кусок памяти.
Ну значит прибабахи компилятора. Кроме того по видимому от состояния памяти/загруженности зависит.
Yandex
Объявления
11.03.2013, 18:20     std::vector
Ответ Создать тему
Опции темы

Текущее время: 21:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru