Russian Qt Forum

Программирование => С/C++ => Тема начата: xruss от Декабрь 25, 2017, 15:22



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


Название: Re: Вопрос по контейнеру Vector.
Отправлено: ViTech от Декабрь 25, 2017, 15:39
Контейнер тут не при чём, нужно смотреть в сторону строк и локалей. Помимо std::string есть ещё std::wstring. Содержать они могут много чего, зависит от кодировки и локали. Localization library (http://en.cppreference.com/w/cpp/locale), header <locale> (http://en.cppreference.com/w/cpp/header/locale), std::tolower(std::locale) (http://en.cppreference.com/w/cpp/locale/tolower).


Название: Re: Вопрос по контейнеру Vector.
Отправлено: Авварон от Декабрь 25, 2017, 18:26
wstring считай нет, потому что у него на винде размер другой (wchar_t - 32 бита)


Название: Re: Вопрос по контейнеру Vector.
Отправлено: xruss от Январь 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;
}

Подскажите, пожалуйста - почему он меня не понимает? :)


Название: Re: Вопрос по контейнеру Vector.
Отправлено: Igors от Январь 06, 2018, 11:48
Для прохода задом наперед нужно использовать реверсные итераторы rbegin и rend
Код
C++ (Qt)
for (auto it = lines.rbegin(); it != lines.rend(); ++it)
cout << *it << endl;
 
Ось малюнок (http://en.cppreference.com/w/cpp/container/vector/rbegin). А если контейнер прямого доступа то с этим страхомудием можно не связываться, просто так
Код
C++ (Qt)
for (int i = lines.size() - 1; i >= 0; --i)
cout << lines[i] << endl;
 
Ну и вообще, итератор - это еще не само значение, a то что на него "указывает" (хотя и не указатель)


Название: Re: Вопрос по контейнеру Vector.
Отправлено: xruss от Январь 06, 2018, 15:02
to Igors: Ура! заработало) спасибо большое! :)