Заменить значение в векторе - PullRequest
2 голосов
/ 08 января 2012

Я хочу добавить закрывающую скобку, где строка начинается с [[

Я пытался использовать find_if, replace_if, но оказалось, что что-то не так

std::vector<std::string> vector(3);

содержит:

    0: text
    1: [[text
    2: text

Что я хочу:

    0: text
    1: [[text]]
    2: text

Не могли бы вы помочь с объяснением алгоритма?

Ответы [ 5 ]

6 голосов
/ 08 января 2012

Может быть, что-то вроде этого:

for (std::string & s : vector)
{
    if (s.size() > 1 && s[0] == '[' && s[1] == '[')
        s += "]]";
}

Если вы хотите проверить уже существующие скобки, добавьте еще несколько проверок.

3 голосов
/ 08 января 2012

Простое решение:

int main()
{ 
    vector<string> v;
    v.push_back("text");
    v.push_back("[[text");
    v.push_back("text");

    for (unsigned i = 0; i < v.size(); i++)
    {
        if (v[i].find("[[") == 0)
        {
            v[i].append("]]");
        }
    }
}
3 голосов
/ 08 января 2012

Как насчет небольшого for_each действия?

void check_and_replace(std::string& str) {
    if (str.length() >= 2) {
        if (str[0] == '[' && str[1] == '[')
            str += "]]";
    }
}

for_each(myvector.begin(), myvector.end(), check_and_replace);
1 голос
/ 08 января 2012

О, это просто. Нет варианта find_if / replace_if для изменения нескольких значений, но есть copy_if.

Итак, учитывая наш вектор,

std::vector<std::string> v = { "text", "[[text", "text" };

мы можем выделить все элементы, которые мы хотим изменить:

std::vector<std::reference_wrapper<std::string>> v2;
std::copy_if(v.begin(), v.end(), std::back_inserter(v2), [](std::string const& s) { return s.compare(0, 2, "[[") == 0 && (s.size() < 2 || s.compare(s.size() - 2, 2, "]]")); } );

, а затем просто преобразуйте каждое из них в желаемое выходное значение:

std::for_each(v2.begin(), v2.end(), [](std::string& x) { return x += "]]"; });

Благодаря стандартным библиотечным алгоритмам мы можем легко проверить нашу работу:

std::for_each(v.begin(), v.end(), [](std::string const& x) { std::cout << x << std::endl; });

Просто убедитесь, что включены все необходимые заголовки.

#include <vector>
#include <string>
#include <iostream>
#include <functional>
#include <algorithm>
0 голосов
/ 08 января 2012

find_if будет работать, если вы используете правильную функцию предиктора.Какой предиктор вы используете?

попробуйте это:

 boolean containsBrackets( string s )
 {
     s.contains("[[");
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...