我遇到如下情况:我需要将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;
}
答案 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与之分离原始内容