如何从 C++ 中的两个字符串向量创建一个字符串?

Posted

技术标签:

【中文标题】如何从 C++ 中的两个字符串向量创建一个字符串?【英文标题】:How to create a string from two vectors of strings in C++? 【发布时间】:2020-11-13 20:05:47 【问题描述】:

我有两个单独的字符串向量:

std::vector<std::string> vectorA;
vectorA.push_back("a1");
vectorA.push_back("\na2");

std::vector<std::string> vectorB;
vectorB.push_back("b1");
vectorB.push_back("b2");

我想创建一个std::string vectorOutput,它显示以下内容:

a1 b1
a2 b2

现在,向量A 中的元素定义在一个类中,而向量B 中的元素来自另一个类,并在发生一些代码逻辑后被读取。矢量大小是相同的。我想知道在 C++ 中创建这个新的vectorOutput 字符串的最佳方法是什么?我正在考虑一个循环,它遍历每个向量的元素并将它们附加到vectorOutput,例如:

for (int i = 0; i < vectorA.size() < i++)

    vectorOutput += vectorA[i] + vectorB[i];

在我的代码中,这些向量的元素比此处显示的要多。还有另一种方法可以实现这一目标吗?也许通过创建枚举或结构?

【问题讨论】:

只要两个向量的大小相同,你的循环就可以了。 什么是 C++ 中最好的方法 -- 询问“最好的方法”是基于意见的。没有“最好”的方式。可能是坏方法,也可能是好方法,但不是“最好的方法”。 考虑使用 std::ostringstream 以获得更好的性能 是的,这两个向量的大小应该相同。我在想也许我可以以某种方式取消循环。最初,我只是逐行将文本附加到字符串,并逐行检索vectorA元素。这对我来说似乎是一个不完美的解决方案。 【参考方案1】:

使用 range-v3 库,您可以这样编写:

namespace rs = ranges;
namespace rv = ranges::views;
    
auto outputVector = rv::transform(vectorA, vectorB, std::plus) 
                  | rv::cache1 
                  | rv::join 
                  | rs::to<std::string>;

这没有循环,并且可读性很好。请注意,需要cache1 以确保views::transform 返回的视图没有悬空。

这是demo。

【讨论】:

看起来很干净,但是我现在使用的是 c++11,并且我打算保持开源 @szumial range-v3 绝对是开源的,否则我绝不会推荐它 :) 但是是的,这至少需要 C++14 才能工作。 我可以确认这个想法是可行的,但是,在我的应用程序中,由于这是一个单一的用例,我对问题中描述的循环有一个初步的想法。感谢您推荐这个库:)【参考方案2】:

如果您在谈论效率,这可能不是最好的方法,因为您每次都会复制字符串。最好直接创建一个长字符串并将其中的一些字符替换为您要连接的字符串:

#include <iostream>
#include <string>

int main() 
    std::string str1 = "stringA";
    int len1 = str1.length();
    std::string str2 = "stringB";
    int len2 = str2.length();
    std::string bigString(256, ' ');          //create a container string 
    bigString.replace(0, len1, str1);         //paste a string within it
    bigString.replace(len1 + 1, len2, str2);  //paste a second string after (with a space to separate)
    
    std::cout << bigString << std::endl;      //=>"stringA stringB           ..."

    //resize it when needed
    bigString.resize(512, ' '); 

【讨论】:

以上是关于如何从 C++ 中的两个字符串向量创建一个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中的字符串向量中找到重复的单词?

C++:如何检测向量中的重复项并打印一份?

(C++) 创建可以从函数访问的动态全局数组/向量

C++ - 如何有效地找出向量中的任何字符串是不是可以由一组字母组合而成

从 C++ dll 编组导出的字符串向量

在 cython 的循环中创建 c++ 映射