Как найти последнее вхождение какого-либо символа во всем векторе <string>, а затем разделить строку на три отдельных элемента - PullRequest
0 голосов
/ 07 августа 2020

Если у меня есть вектор строки vector<string> vec и я хочу найти последнее вхождение какого-либо символа ',' в полный вектор , тогда разделите строку на три отдельных элемента в векторе в одном месте.

vector<string> vec1 = { "string1","str,in,g2" , ",string3 " , "my,target" ," string4" };
vector<string> vec2 = { "string1","str,in,g2" , ",string3 " , "my,tar,get" ," string4" };

Я хочу преобразовать вектор в:

vector<string> vec1 = { "string1","str,in,g2" , ",string3 " , "my" , "," , "target" , "string4" };
vector<string> vec1 = { "string1","str,in,g2" , ",string3 " , "my,tar" , "," , "get" , "string4" };

есть короткий путь к этому, вместо того, чтобы проверять каждую строку с конца вектора и копировать ее в новую ?

Я использую c ++ 11.

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Используйте команду find, чтобы получить последнюю запись, в которой есть ',', например

vector<string> v = ....;
iter = find(v.rbegin(), v.rend(),
            [](const string& s) {return s.find(',') != string::npos;});

После проверки вы действительно нашли что-то разделение записи.

// Find the last one, no need to check for not found, we know the string contains 
// a comma. You check above.
auto pos = iter->rfind(','); 
auto first = iter->substr(0, pos);
auto last = iter->substr(pos + 1);

*iter = first;
iter = v.insert(iter + 1, ",");  // No need to extract the comma since it's always a comma.
v.insert(iter + 1, last);

Как вы можете см. здесь немного итератора logi c. Убедитесь, что вы запускаете отладчик в нескольких случаях, чтобы убедиться, что мы все сделали правильно.

0 голосов
/ 07 августа 2020

Просто используйте обратные итераторы:

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

int main() {
    std::vector<std::string> vec = { "string1","str,in,g2" , ",string3 " , "my,target" ," string4" };
    for (auto it = vec.rbegin(); it != vec.rend(); it++) {
        std::string str = *it;
        auto comma_pos = std::find(str.rbegin(), str.rend(), ',');
        if (comma_pos != str.rend()) {
            std::string str1(str.begin(), comma_pos.base() - 1);
            std::string str2(",");
            std::string str3(comma_pos.base(), str.end());
            auto insert_it = it.base();
            insert_it = vec.insert(insert_it, str3);
            insert_it = vec.insert(insert_it, str2);
            insert_it = vec.insert(insert_it, str1);
            vec.erase(insert_it - 1);
            break;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...