c ++,指针,引用,从一个函数传递到另一个函数,std :: vector,std :: string

时间:2011-08-18 14:02:17

标签: c++ string pointers vector reference

我有一个指针和引用的特定问题,std :: vector和std :: string。有些问题在以下代码中被剪切,一些在下面。

我基本上有这段代码

//first of all: is this function declaration good?
//or shoudl I already pass the std::vector in another way?
//I'm only reading from it
void func(const std::vector<std::string>& vec)
{
    //I need to call otherFunc(void*) with  a single element from vec:
    //otherFunc(void* arg);
    //with arg being a void* to vec[0]
}

我的IDE告诉我只有&*vec[0]作为otherFunc的参数,但这不会编译......

如何进行这类参数传递的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

这是一个很好的声明,只要该函数不是为了修改向量。它比传递值更有效,因为它避免了复制向量 - 这是一项需要内存分配的昂贵操作。

但是,另一个函数需要一个非const指针。如何处理这取决于它是否可以修改数据。

如果它不会(正如你所说的那样,“我只是从中读取它”)那么选项是:

  • 将其更改为otherFunc(void const * arg),以更好地保证不会,或
  • 在调用const时删除const_cast<void*>资格

请注意,&*vec[0]将无法编译;你希望vec[0].c_str()获得与第一个字符串数据的C兼容指针,假设这是你需要的。

如果它可能修改了向量,那么你将不得不做其他事情,因为没有合法的方法通过指向其数据的指针来修改std::string。可能最好的选择是使用std::vector<char>而不是std::string,但这取决于函数的确切功能。

答案 1 :(得分:1)

首先,&*vec[0]毫无意义;你可能意味着&vec[0](即你向量中第一个字符串的地址)。

但即使这样也无法编译,因为&vec[0]的类型为const std::string *。最重要的是,它是const。你可以这样做:

otherFunc(const_cast<std::string *>(&vec[0]));

但是!!! 尝试在const std::string *的上下文中使用void *听起来非常糟糕。怎么可能做任何有用的事情?

答案 2 :(得分:1)

首先,由于您只是从向量中读取,将其作为const引用传递是一个好主意,应该可以正常工作。

关于你的第二个问题:很难说otherFunc会对你的对象做什么,因为它需要一个void指针。这是C风格,不应该在C ++中使用,有更好的和类型安全的方法。