Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
#1

Не получается вставить элемент в вектор - C++

24.08.2014, 22:51. Просмотров 508. Ответов 14
Метки нет (Все метки)

Почему нельзя таким образом вставить элемент в вектор?
C++
1
2
3
4
5
6
7
8
9
#include <vector>
using SomeVeryLongNamedType = int;
int main() 
{
    std::vector<SomeVeryLongNamedType> vec;
    vec.emplace_back(vec.value_type()); // Так ведь меньше писать и более наглядно!
//    vec.emplace_back(std::vector<SomeVeryLongNamedType>::value_type());  // а так можно
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2014, 22:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не получается вставить элемент в вектор (C++):

Вектор: вставить новый элемент после последнего положительного - C++
Дан вектор из n элементов, которые считываются с клавиатуры, Вставить новый элемент после последнего положительного.

Вставить в вектор новый элемент перед элементом с заданным индексом - C++
Здравствуйте. У меня следующая проблема: Мне в программе нужно в вектор вставить в определенное место элемент. Лучше всего мне походит...

Дан двумерный массив размером 5 * 8, заполненный случайным образом. Вставить перед всеми строками, первый элемент которых делится на3,вставить.... - C++
Дан двумерный массив размером 5 * 8, заполненный случайным образом. Вставить перед всеми строками, первый элемент которых делится на 3,...

Вставить значения в вектор - C++
Пытаюсь вставить значения в вектор, но при запуске программы получаю ошибку сегментирования, ошибка пропадает если после добавления...

Не получается заполнять вектор X и Y - C++
Не получается заполнять вектор X и Y #include &lt;SDL.h&gt; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;array&gt; #include &lt;vector&gt;...

не получается заполнить вектор структур - C++
Есть вектор структур class Console { public: struct MyStruct { int begin_M; int end_M; }; std::vector &lt;MyStruct&gt;...

14
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
24.08.2014, 23:08 #2
Потому, что value_type не является членом класса. Что мешает typedef использовать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <vector>
 
using SomeVeryLongNamedType = int;
 
typedef std::vector< int > Vec;
 
typedef Vec::value_type ValueType;
 
int main() 
{
    Vec vec;
 
    vec.emplace_back( ValueType() );
 
    return 0;
}
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
24.08.2014, 23:11 #3
gromo, так не подойдёт?
C++
1
vec.push_back({});
1
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
24.08.2014, 23:12  [ТС] #4
Цитата Сообщение от Toshkarik Посмотреть сообщение
Потому, что value_type не является членом класса.
Почему не является? value_type по стандарту находится в public секции шаблона std::vector.
Да и компилятор ругается не на отсутствие члена класса, а на неправильное использование.
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
24.08.2014, 23:13 #5
Цитата Сообщение от gromo Посмотреть сообщение
value_type по стандарту находится в public секции шаблона std::vector.
Но это не член-данные класса.
0
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
24.08.2014, 23:17  [ТС] #6
Цитата Сообщение от gray_fox Посмотреть сообщение
Но это не член-данные класса.
И все же, почему нельзя его использовать? Ведь к enum-члену класса можно обращаться. Все это "сущности" - типы, объекты, функции.
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
24.08.2014, 23:21 #7
Цитата Сообщение от gromo Посмотреть сообщение
Почему не является?
Потому, что это typedef, а не объект или функция.

Добавлено через 35 секунд
Операция точка это операция доступа к члену класса, коим typedef не является.
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
24.08.2014, 23:23 #8
Цитата Сообщение от gromo Посмотреть сообщение
И все же, почему нельзя его использовать? Ведь к enum-члену класса можно обращаться. Все это "сущности" - типы, объекты, функции.
Потому что таковы правила языка: к вложенным типам и статическим членам надо обращаться с помощью оператора :: .
0
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
24.08.2014, 23:27  [ТС] #9
Цитата Сообщение от gray_fox Посмотреть сообщение
Потому что таковы правила языка: к вложенным типам и статическим членам надо обращаться с помощью оператора :: .
Хорошо, enum ведь является типом? Всегда вроде бы являлся. И такой код работает:
C++
1
2
3
4
5
6
7
8
9
struct A {
    enum class Enum { First, Last };
};
 
int main() {
    A a;
    std::cout << (int)a.Enum::First;
    return 0;
}
1
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
24.08.2014, 23:28 #10
Можно вот так:
C++
1
decltype( vec )::value_type
0
gray_fox
24.08.2014, 23:30
  #11

Не по теме:

Цитата Сообщение от gromo Посмотреть сообщение
И такой код работает
Не знал.

0
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
24.08.2014, 23:30  [ТС] #12
Цитата Сообщение от Voivoid Посмотреть сообщение
Можно вот так:
C++
1
decltype( vec )::value_type
интересно, но многовато писать. Я тут пытаюсь не переработаться
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
24.08.2014, 23:37 #13
Цитата Сообщение от gromo Посмотреть сообщение
интересно, но многовато писать. Я тут пытаюсь не переработаться
Увы, но C++ не отличается лаконичностью. Хочется поменьше писать - бери haskell

Добавлено через 4 минуты
Если вдруг кто не знал, то есть еще такая вот интересная конструкция:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct foo {
  virtual void f() {
  }
};
 
struct bar : foo {
  void f() {
  }
};
 
int main() {
 
  bar b;
  b.foo::f(); // как можно догадаться, вызов foo::f
 
  return 0;
}
1
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
24.08.2014, 23:47  [ТС] #14
Цитата Сообщение от Voivoid Посмотреть сообщение
Если вдруг кто не знал, то есть еще такая вот интересная конструкция
в принципе таким же мокаром передаются аргументы базовому классу в списке инициализации членов производного класса.
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.08.2014, 02:28 #15
Цитата Сообщение от Voivoid Посмотреть сообщение
Если вдруг кто не знал, то есть еще такая вот интересная конструкция:
это сделано для разруливания вызова при ромбовидном наследовании без применения виртуального наследования.
0
25.08.2014, 02:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2014, 02:28
Привет! Вот еще темы с ответами:

Перед каждым положительным элемент массива вставить элемент с нулевым значением - C++
6)Дан массив размера N. Перед каждым положительным элемент массива вставить элемент с нулевым значением.

Вставить данные типа float в вектор - C++
Вставить данные типа float введенные с клавиатуры Если чётный номер - в конец, нечет, - в начало вектора. #include &lt;iostream&gt; ...

Вставить после данного элемента списка новый элемент, и вывести указатель на добавленный элемент - C++
Дано число D и указатель Р0 на один из элементов пустая двозвязного списка. Вставить после данного элемента списка новый элемент со...

Не получается заполнить вектор объектами класса - C++
Здравствуйте. Решения для своей проблемы на форуме не нашел, по этому пришлось создать тему. Есть класс: class CAnimate { private: ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.