替换矢量中的值

Replace value in a vector

本文关键字:替换      更新时间:2023-10-16

我想在字符串以[[ 开头的地方添加右括号

我试着使用find_ifreplace_if,但结果发现有些不对劲

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

包含:

    0: text
    1: [[text
    2: text

我想要什么:

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

你能帮我解释一下算法吗?

也许是这样的:

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

如果要检查已有的括号,请再添加一些检查。

简单的解决方案:

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

来一点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);

哦,这很容易。不存在用于突变多个值的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>
如果使用正确的预测器函数,

find_if将起作用。你在用什么预测器?

试试这个:

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