С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 9

Не обнуляется vector<string>

03.06.2016, 15:26. Показов 1196. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
 
using namespace std;
template <typename T>
void showD(vector<T>& arr, string texts, bool val = false) {
    for (vector<T>::iterator it = arr.begin(); it != arr.end(); ++it) {
        cout << *it << " ";
    }
 
    if (texts != "") {
        cout << " "+texts << endl;
    }
    arr.clear(); 
    if (!val) {
        arr = { 0,0,0,0,0,0,0,0,0,0,0 };
    }
    else {
        arr = { "", "", "", "", "" }; //ошибка происходит здесь.
    }
        
        
}
 
int main() {
    setlocale(LC_ALL, "Rus");
    vector<int> arr = { 9,60,70,8,45,87,90 };
    vector<int> arr2 = { 0,0,0,0,0,0,0,0,0,0,0 };
    vector<int>::iterator it, it2;
    pair<vector<int>::iterator, vector<int>::iterator> pair2;
 
    copy(arr.begin(), arr.end(), arr2.begin()); //копирование из arr в arr2
    showD(arr2,"копирование из arr в arr2");
    copy_if(arr.begin(), arr.end(), arr2.begin(), [](int x) {return x < 70; });
    showD(arr2, "копирование из arr в arr2 с условием");
    copy_n(arr.begin(), 4, arr2.begin());
    showD(arr2, "копирование первых 4ех цифер");
    copy_backward(arr.begin(), arr.end(), arr2.end());
    showD(arr2, "копирование в зад");
 
    vector<string> arr3 = { "apple","orange","banana","berry" };
    vector<string> arr4 = { "","","","","" };
 
    move(arr3.begin(), arr3.end(), arr4.begin());
    showD(arr4, "перенос элементов string из arr3 в arr4", true); //c этого момента ошибка
 
 
 
    cin.get();
 
    return 0;
}
я разбираю алгоритмы, и надо было написать удобную функцию, которая бы выводила элементы массива и обнуляла массив для последующего использования. это работает с int, но не со string - ошибка binary '=': no operator found which takes a right-hand operand of type 'initializer list' (or there is no acceptable conversion)

почему?
спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.06.2016, 15:26
Ответы с готовыми решениями:

Не могу вставить элемент в second(vector) мультимапа. multimap<string, vector<string>>
#include &lt;iostream&gt; #include &lt;map&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;string&gt; #include &lt;iterator&gt; int main() ...

Доступ к паре в map<string, vector<pair<string, string>>>Temp
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string, vector&lt;pair&lt;string,...

Перенос данных c vector<string> в vector<double>
Необходимо перенести введенные данные в vector&lt;string&gt; в vector&lt;double&gt;, я реализовал это вот так: word.push_back(a); ...

8
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.06.2016, 15:53
Цитата Сообщение от Dobbyman Посмотреть сообщение
почему?
Потому, что шаблоны так писать нельзя (если, все-таки очень хочется - дождитесь constexpr if. Пару лет где-то).
Весь текст шаблона должен быть компилябельным, несмотря на то, что одна из веток не выполняется. Специализируем вручную ваш шаблон для int:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void showD(vector<int>& arr, string texts, bool val = false) {
    for (vector<int>::iterator it = arr.begin(); it != arr.end(); ++it) {
        cout << *it << " ";
    }
 
    if (texts != "") {
        cout << " "+texts << endl;
    }
    arr.clear(); 
    if (!val) {
        arr = { 0,0,0,0,0,0,0,0,0,0,0 };
    }
    else {
        arr = { "", "", "", "", "" };  попытка инициализировать vector<int> с помощью строк. Как здесь без ошибки?
    }      
}
1
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 9
03.06.2016, 16:00  [ТС]
я понимаю, что нельзя vector<int> инициализировать с помощью строк. но я ведь подаю на вход vector<string>, и даже отправляю bool переменную, которая для vector<int> берет первое условие, для vector<string> второе(хотя для наглядности стоило через typeid сделать).
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
03.06.2016, 16:05
Dobbyman, компилятор не интересует, что ты это предусмотрел, он проверяет все варианты и натыкается на то, что, возможно, int`овый массив пытаются инициализировать пустыми строками.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.06.2016, 16:16
Лучший ответ Сообщение было отмечено Dobbyman как решение

Решение

Цитата Сообщение от Dobbyman Посмотреть сообщение
которая для vector<int> берет первое условие, для vector<string> второе
Пофиг. Представьте себе шаблон, как много перегруженных функций, отличающихся только конкретным типом в определенных местах. В предыдущем сообщении функция (без всяких шаблонов) не скомпилится. Почему она должна компилиться если вы обозначите тип неявно (после специализации T превратится в int)?

Вот рабочий пример, как можно сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename T>
void showD(vector<T>& arr, string texts, bool val = false) {
    for (vector<T>::iterator it = arr.begin(); it != arr.end(); ++it) {
        cout << *it << " ";
    }
 
    if (texts != "") {
        cout << " " + texts << endl;
    }
    arr.clear();
    size_t sz = std::is_same<T, int>::value ? 11 : 5; // если int 11 в других случаях (std::string) - 5
    arr.resize(sz, T());
}
Добавлено через 6 минут
Dobbyman, Так, по вашему должно все компилиться?
C++
1
2
3
4
5
6
7
8
9
void f()
{
    bool b=true;
    int s;
    if(b)
        s=0;
    else
        s="";
}
1
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
03.06.2016, 16:29
Так не подойдет?
C++
1
2
3
4
if (val)
     arr = std::vector<T>(5, T());
else
     arr = std::vector<T>(11, T());
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.06.2016, 16:47
Цитата Сообщение от notAll Посмотреть сообщение
Так не подойдет?
Да, в принципе, подойдет, но заметьте, что val - не нужен:
C++
1
if(std::is_same<T, std::string>::value) // если тип T - это std::string
0
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 9
03.06.2016, 17:15  [ТС]
хорошо. исправьте, если я не прав.
1) подавая на вход vector с 2 разными типами, мы создаем 2 специализации шаблона функции showD.
2) т.е. шаблон имитирует перегрузку функции под каждый тип переменной.
3) относится к
Весь текст шаблона должен быть компилябельным
- я только сейчас открыл для себя это. странно, что компилятор заглядывает туда, куда ему велели не суваться - тот же php себе такое не позволяет. видимо тут срабатывает различие между скриптовым языком и компилируемым. пока я вручную не скопировал две функции с разными типами и не увидел ошибки, я этого не понимал.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.06.2016, 18:22
Цитата Сообщение от Dobbyman Посмотреть сообщение
я только сейчас открыл для себя это
Шаблоны задумывались как способ избежания китайского кода (много одинаковых функций). Логика их работы схожа с макросами, хоть и с очень важными отличиями. Это уже потом случайно выяснили, что они сами по себе язык программирования.
Цитата Сообщение от Dobbyman Посмотреть сообщение
тот же php себе такое не позволяет
php - язык интерпретируемый, в отличии от C++. Поэтому ему и не нужно (и даже вредно, т.к. это замедлит выполнение) знать, что творится в неиспользуемых ветвях. А C++ должен скомпилировать весь код. Даже с учетом того, что хороший оптимизатор просто выкинет неиспользуемые ветки, в стандарте сказано, в каких случаях должна быть ошибка компиляции, и это не зависит от того, попадет ли туда когда-нибудь поток.

Добавлено через 21 минуту
Повторюсь: Возможность отсеивать ветки на этапе компиляции планируется.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.06.2016, 18:22
Помогаю со студенческими работами здесь

Какое одинаковое значение можно вернуть из функций <string> f () и vector < <string> > f()?
Понятное дело, что всё обсуждение будет вертеться вокруг аналога NULL. char* f_0 () { return NULL; } char** f_1 () { ...

Как перебрать все элементы в map<string, vector<string>>
Доброго времени суток. Решаю следующую задачу: В файле есть сведения об автомобилях: марка автомобиля, номер и фамилия владельца. ...

Вывод элементов map <string,vector<string>>
Доброго времени суток. Как можно вывести массив map &lt;string,vector&lt;string&gt;&gt; mp ? Могу только предположить, что нужно как-то...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Vector в string
Какой самый удачный способ преобразовать вектор в строку?


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru