在函数周围传递C样式字符串

时间:2010-09-17 10:55:56

标签: c++

我遇到如下情况:我需要将C风格的字符串传递给函数并将其存储到稍后需要使用的容器中。容器正在存储char *。我无法弄清楚创建内存并将其存储到向量中的有效方法。在overloadedfunctionA(int)中,我需要创建新的内存并复制到缓冲区,然后传入overloadedfunctionA(char *),再次创建新的内存并再次复制到缓冲区。想象一下,我有很多int和其他类型的项目,我每次都做两次工作。解决它的一种方法是将逻辑从overloadedfunctionA(char *)复制到overloadedfunctionA(int)。但它会导致很多重复的代码。有关更有效方法的任何想法吗?

感谢。

int main(){

overloadedfunctionA(5);
overloadedfunctionA("abc");

}

vector<char*> v1;

void overloadedfunctionA(int intA){
 char* buffer = new char[];
 convert int to char in buffer;
 overloadedfunctionA(buffer1); 
 delete buffer;

}

//act as base function that has a lot of logic need to be performed
void overloadedfunctionA(char* string1){
char* buffer = new char[];
copy string to buffer;
insert string into vector1;
}

4 个答案:

答案 0 :(得分:8)

对于所有这些都是神圣的,只需在内部使用std::string即可。您可以从std::string分配给const char*,并且可以通过std::string方法访问c_str()的基础C字符串。 否则,您需要编写一个包装器类来为您处理内存分配,并在您的向量中存储该类的实例;但是,std::string已经是这样的包装类。

答案 1 :(得分:1)

希望您可以更轻松地使早期的解决方案更容易遵循......

#include <vector>
#include <string>
#include <sstream>

std::vector<std::string> the_vector;

// template here... use an overload if you prefer...
template <typename T>
void fn(const T& t)
{
    std::ostringstream oss;
    oss << t;
    the_vector.push_back(t.str());
}

int main()
{
    fn(3);
    fn("whatever");
}

答案 2 :(得分:0)

您可以做的一个优化是维护字符串的静态哈希映射,以便您可以将单个实例用于重复值。 另一种解决方案是使用std::string并将overloadedfunctionA(char*)重新声明为overloadedfunctionA(const std::string&)。 另一种选择是让Garbage Collector进行内存管理。

答案 3 :(得分:0)

如果您的字符串很长,以致复制可能是性能问题,您可以考虑将boost::shared_array作为std::string的替代方案。如果内容是不变的,这提供了一种解决方案,其中只需要将一个字符串副本保存在存储器中。但请注意,您将在此处交换字符串复制开销的引用计数开销。

有些编译器可能会以这种方式为您优化std::string,以便保留并重新计算单个副本,直到内容发生更改,当为修改后的内容分配新数组时,其refcount与之分离原始内容