替换向量中的值

时间:2012-01-08 15:36:07

标签: c++ stl

我想添加字符串以[[

开头的右括号

我尝试使用find_ifreplace_if但事实证明某些事情不对

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

包含:

    0: text
    1: [[text
    2: text

我想要的是什么:

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

你能帮忙解算算法吗?

5 个答案:

答案 0 :(得分:6)

也许是这样的:

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

如果要检查现有的括号,请添加更多检查。

答案 1 :(得分: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 :(得分: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("]]");
        }
    }
}

答案 3 :(得分: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>

答案 4 :(得分:0)

如果使用正确的预测函数,

find_if将起作用。您使用的预测器是什么?

试试这个:

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