C++ C++;printf std::vector

C++ C++;printf std::vector,c++,vector,printf,C++,Vector,Printf,如何在C++中执行类似操作: void my_print(format_string) { vector<string> data; //Fills vector printf(format_string, data); } my_print("%1$s - %2$s - %3$s"); my_print("%3$s - %2$s); 作废我的打印(格式化字符串){ 矢量数据; //填充向量 printf(格式、字符串、数据); } 我的打印(“%1$s-%2$

如何在C++中执行类似操作:

void my_print(format_string) {
   vector<string> data;
   //Fills vector
   printf(format_string, data);
}

my_print("%1$s - %2$s - %3$s");
my_print("%3$s - %2$s);
作废我的打印(格式化字符串){
矢量数据;
//填充向量
printf(格式、字符串、数据);
}
我的打印(“%1$s-%2$s-%3$s”);
我的打印(“%3$s-%2$s”);
我之前没有解释清楚。格式字符串是由应用程序用户输入的

在C#中,这起作用:

void my_print(format_string) {
 List<string> data = new List<string>();
 //Fills list
 Console.WriteLine(format_string, data.ToArray);
}

my_print("{0} - {1} - {2}");
my_print("{2} - {1}");
作废我的打印(格式化字符串){
列表数据=新列表();
//填充列表
Console.WriteLine(格式为字符串,数据为数组);
}
我的打印(“{0}-{1}-{2}”);
我的印刷品(“{2}-{1}”);
给你想要的人打电话

printf("%1$s - %2$s - %3$s", date[0].c_str(), data[1].c_str(), data[2].c_str());
请注意,您必须转换为C样式字符串-printf不能为您这样做


Edit:为了回答您修改后的问题,我认为您必须自己解析格式字符串,因为您必须验证它。printf()不起作用。

如果要使用流,您还可以将
ostream\u迭代器
与循环构造(如
copy
)结合使用:

vector<string> data;
data.assign(10, "hello");

copy( &data[0], &data[3], ostream_iterator<string>(cout, " "));
矢量数据;
数据分配(10,“你好”);
复制(&数据[0],&数据[3],ostream_迭代器(cout,”);
请注意,
copy
的第二个参数指向结束后的一个参数。输出:

你好你好

这可能会有帮助

#include <boost/format.hpp>
#include <vector>
#include <string>
#include <iostream>
int main(int arc, char** argv){
   std::vector<std::string> array;
   array.push_back("Hello");
   array.push_back("word");
   array.push_back("Hello");
   array.push_back("again");
   boost::format f("%s, %s! %s %s! \n");
   f.exceptions( f.exceptions() &
     ~ ( boost::io::too_many_args_bit | boost::io::too_few_args_bit )  );

   for (std::vector<std::string>::iterator i=array.begin();i!=array.end();++i){
      f = f % (*i);
   }
   std::cout << f;
   return 0;
}
#包括
#包括
#包括
#包括
int main(int arc,字符**argv){
std::矢量阵列;
array.push_back(“Hello”);
数组。推回(“单词”);
array.push_back(“Hello”);
数组。推回(“再次”);
格式f(“%s,%s!%s%s!\n”);
f、 例外(f.例外()&
~(boost::io::太多参数位| boost::io::太少参数位);
对于(std::vector::iterator i=array.begin();i!=array.end();++i){
f=f%(*i);
}

std::cout我认为您希望执行以下操作:

  • 将您的
    std::vector
    转换为
    char*
    s的
    va_列表
  • 将该
    va_列表
    与用户提供的格式字符串一起传递到
    vprintf

  • 我仍然不知道如何执行第1步。(我知道,大多数高级语言,如java、斯卡拉和露比,都有一个简单、安全、直接的转换,C++没有。)我已经暂时解决了这个函数:

    string format_vector(string format, vector<string> &items)
    {   
       int counter = 1;
    
       replace_string(format,"\\n","\n");
       replace_string(format,"\\t","\t");
    
       for(vector<string>::iterator it = items.begin(); it != items.end(); ++it) {
            ostringstream stm; stm << counter;
            replace_string(format, "%" + stm.str(), *it);
            counter++;
       }
        return format;
    }
    
    字符串格式\u向量(字符串格式、向量和项)
    {   
    int计数器=1;
    替换字符串(格式,\\n,“\n”);
    替换_字符串(格式,\\t,“\t”);
    对于(向量::迭代器it=items.begin();it!=items.end();++it){
    
    ostringstream stm;stm但是OP想要的输出是“hello-hello-hello”
    ostream_迭代器
    在这里不起作用。它将分隔符附加到每一次写入,而提问者想要一个分隔符(即,在最后一次写入之后不附加分隔符)@Neil&Steve:是的。尽管如此,我发现很多人都不熟悉这种技术,它在许多需要纯
    printf
    的情况下非常有用。例如,将调试数据转储到屏幕上。尽管标准中没有包含这种技术,但只插入分隔符的类似于ostream_迭代器的类是非常有用的完全可以。参见:您不想使用<代码>和数据[0 ] <代码>和数据[3 ] < /代码> -标准不保证它能工作。您应该使用<代码>数据> <代码> >和<代码>数据>()<代码> > %1 1美元打印第一个字符串,%$2 s秒,等等…C ^有内省,C++不(至少不在方框中),所以你不能只打印任意对象。你必须添加更多的上下文,比如是否只需要输出
    字符串
    对象等。我假设他的数组的元素数可能可变。@Ken:是的,格式字符串可以更改。@Sebtm,请接受答案,这样我们就可以知道你最终选择了什么解决方案。我认为至少,这是一个相当合理的解决方案。
    string format_vector(string format, vector<string> &items)
    {   
       int counter = 1;
    
       replace_string(format,"\\n","\n");
       replace_string(format,"\\t","\t");
    
       for(vector<string>::iterator it = items.begin(); it != items.end(); ++it) {
            ostringstream stm; stm << counter;
            replace_string(format, "%" + stm.str(), *it);
            counter++;
       }
        return format;
    }