Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Dobbyman
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 9
1

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

03.06.2016, 15:26. Просмотров 883. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
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;...

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

Перенос данных c vector<string> в vector<double>
Необходимо перенести введенные данные в vector&lt;string&gt; в vector&lt;double&gt;, я...

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

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

8
avgoor
1041 / 609 / 157
Регистрация: 05.12.2015
Сообщений: 1,732
03.06.2016, 15:53 2
Цитата Сообщение от 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
Dobbyman
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 9
03.06.2016, 16:00  [ТС] 3
я понимаю, что нельзя vector<int> инициализировать с помощью строк. но я ведь подаю на вход vector<string>, и даже отправляю bool переменную, которая для vector<int> берет первое условие, для vector<string> второе(хотя для наглядности стоило через typeid сделать).
0
no_attention
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
03.06.2016, 16:05 4
Dobbyman, компилятор не интересует, что ты это предусмотрел, он проверяет все варианты и натыкается на то, что, возможно, int`овый массив пытаются инициализировать пустыми строками.
0
avgoor
1041 / 609 / 157
Регистрация: 05.12.2015
Сообщений: 1,732
03.06.2016, 16:16 5
Лучший ответ Сообщение было отмечено 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
notAll
452 / 172 / 63
Регистрация: 27.05.2016
Сообщений: 461
Завершенные тесты: 2
03.06.2016, 16:29 6
Так не подойдет?
C++
1
2
3
4
if (val)
     arr = std::vector<T>(5, T());
else
     arr = std::vector<T>(11, T());
0
avgoor
1041 / 609 / 157
Регистрация: 05.12.2015
Сообщений: 1,732
03.06.2016, 16:47 7
Цитата Сообщение от notAll Посмотреть сообщение
Так не подойдет?
Да, в принципе, подойдет, но заметьте, что val - не нужен:
C++
1
if(std::is_same<T, std::string>::value) // если тип T - это std::string
0
Dobbyman
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 9
03.06.2016, 17:15  [ТС] 8
хорошо. исправьте, если я не прав.
1) подавая на вход vector с 2 разными типами, мы создаем 2 специализации шаблона функции showD.
2) т.е. шаблон имитирует перегрузку функции под каждый тип переменной.
3) относится к
Весь текст шаблона должен быть компилябельным
- я только сейчас открыл для себя это. странно, что компилятор заглядывает туда, куда ему велели не суваться - тот же php себе такое не позволяет. видимо тут срабатывает различие между скриптовым языком и компилируемым. пока я вручную не скопировал две функции с разными типами и не увидел ошибки, я этого не понимал.
0
avgoor
1041 / 609 / 157
Регистрация: 05.12.2015
Сообщений: 1,732
03.06.2016, 18:22 9
Цитата Сообщение от Dobbyman Посмотреть сообщение
я только сейчас открыл для себя это
Шаблоны задумывались как способ избежания китайского кода (много одинаковых функций). Логика их работы схожа с макросами, хоть и с очень важными отличиями. Это уже потом случайно выяснили, что они сами по себе язык программирования.
Цитата Сообщение от Dobbyman Посмотреть сообщение
тот же php себе такое не позволяет
php - язык интерпретируемый, в отличии от C++. Поэтому ему и не нужно (и даже вредно, т.к. это замедлит выполнение) знать, что творится в неиспользуемых ветвях. А C++ должен скомпилировать весь код. Даже с учетом того, что хороший оптимизатор просто выкинет неиспользуемые ветки, в стандарте сказано, в каких случаях должна быть ошибка компиляции, и это не зависит от того, попадет ли туда когда-нибудь поток.

Добавлено через 21 минуту
Повторюсь: Возможность отсеивать ветки на этапе компиляции планируется.
1
03.06.2016, 18:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2016, 18:22

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

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

Vector и String
Доброго времени суток. Прошу прощения за, скорее всего, часто повторяющийся...


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

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

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