Russian Qt Forum
Апрель 23, 2024, 16:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по контейнеру Vector.  (Прочитано 4514 раз)
xruss
Гость
« : Декабрь 25, 2017, 15:22 »

Всем привет! а тут можно пообсуждать STL по части контейнеров? Есть ли в STL в контейнере Vector возможность работать с русскими символами в std::vector<string>? Пытался применять метод std::transform(ftext.begin(), ftext.end(), ftext.begin(), ::tolower); он вроде не понимает русской utf-8 Грустный Как думаете в этом случае возможно использовать только QT-шный QString или я не правильно что-то делаю?
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #1 : Декабрь 25, 2017, 15:39 »

Контейнер тут не при чём, нужно смотреть в сторону строк и локалей. Помимо std::string есть ещё std::wstring. Содержать они могут много чего, зависит от кодировки и локали. Localization library, header <locale>, std::tolower(std::locale).
Записан

Пока сам не сделаешь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #2 : Декабрь 25, 2017, 18:26 »

wstring считай нет, потому что у него на винде размер другой (wchar_t - 32 бита)
Записан
xruss
Гость
« Ответ #3 : Январь 05, 2018, 18:17 »

Спасибо за ответы, я попробовал, но у меня получилось только с QString Улыбающийся
А вот с обыцным STL не получается вообще собрать контейнер vector со строками((
Написал программу - аналог Linux`овского tac (выводит строки с последней к первой).
ошибка в коде:
Код:
 /home/pavel/programming/analog_tac/main.cpp:35: ошибка: no matching function for call to 'std::vector<std::__cxx11::basic_string<char> >::end(std::__cxx11::string&)'
     for(string it = lines.end(line); it == lines.begin(line); it.end(line)--){ /* Выводим строки задом-наперёд */

Вот такой код:
Код:
#include <QCoreApplication>

#include <stdio.h>
#include <iostream>

#include <algorithm>
#include <iterator>
#include <vector>
#include <string>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
    if (argc > 1) /* проверка есть ли хотя бы 1-н аргумент*/
    {
        cout << argv[1] << endl;
    } else {
        cout << "Not arguments" << endl;
    }

    string line;
    vector<string> lines;

    ifstream file(argv[1]);
    while(getline(file, line)){ /* пока не достигнут конец файла класть очередную строку в переменную */
        lines.push_back(line);
    }

//    for(string line = lines.end(); line >= lines.begin(); line.end()--){ /* Выводим строки задом-наперёд */
//        cout << line << endl;
//    }
// !!!через итераторы не получилось((!!!

    for(string it = lines.end(line); it == lines.begin(line); it.end(line)--){ /* Выводим строки задом-наперёд */
        cout << line << endl;
    }
return 0;
}

Подскажите, пожалуйста - почему он меня не понимает? Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Январь 06, 2018, 11:48 »

Для прохода задом наперед нужно использовать реверсные итераторы rbegin и rend
Код
C++ (Qt)
for (auto it = lines.rbegin(); it != lines.rend(); ++it)
cout << *it << endl;
 
Ось малюнок. А если контейнер прямого доступа то с этим страхомудием можно не связываться, просто так
Код
C++ (Qt)
for (int i = lines.size() - 1; i >= 0; --i)
cout << lines[i] << endl;
 
Ну и вообще, итератор - это еще не само значение, a то что на него "указывает" (хотя и не указатель)
Записан
xruss
Гость
« Ответ #5 : Январь 06, 2018, 15:02 »

to Igors: Ура! заработало) спасибо большое! Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 22.