2012-01-08 3 views
2

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

Я попытался с помощью find_if, replace_if, но получается, что-то не так

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

содержит:

0: text 
    1: [[text 
    2: text 

Что я хочу:

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

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

+1

Это скобки, а не скобки. –

+0

Что вы делали до сих пор? –

+0

Какой у вас код? Что не сработало? Вы пытались отладить? –

ответ

6

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

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

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

0

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

попробовать это:

boolean containsBrackets(string s) 
{ 
    s.contains("[["); 
} 
3

Как насчет 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); 
+2

Передача' str' по значению - плохая идея, потому что 'str + ="]] ";' изменяет только локальную копию. – fredoverflow

+0

Ах, вы правы. Тратить слишком много времени на python и C#, где это не имело бы значения. Я считаю, что мое редактирование исправляет это? –

+0

выглядит хорошо ... – fredoverflow

3

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

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("]]"); 
     } 
    } 
} 
1

О, это легко. Существует нет 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

Подробнее THX за идею! – Duglas

Смежные вопросы