您好,我有一个带有const字符串指针的结构:

struct something{
    something(const string & a, const string &b)
    {
        first=&a;
        second=&b;
    }
    const string * first;
    const string * second;
    int somethingelse;
};


我到达那里是因为我不想创建字符串的本地副本,所以我的问题是如何正确使用这些字符串的值,我需要执行诸如比较字符串之类的操作。我试图这样做:

vector<something> myvec;
something tmp1("hello","world");
something tmp2("hello","world");
myvec.push_back(tmp1);
myvec.push_back(tmp2);
cout << *myvec[0].first;
if((*(myvec[0].first)+*(myvec[0].second))==(*(myvec[1].first)+*(myvec[1].second)))
 cout << '1';


但是它并不是真的可以工作,并且valgrind存在很多问题。
将不胜感激任何建议。

编辑:---------------->

好的,大家大概对我确实需要对字符串进行本地复制这一事实是正确的。我实际上发现在我的程序中制作本地副本并不是真正的问题。问题是字符串之间的比较。
我到达了一个具有很多比较功能的排序算法:

if(((myvec[0].first)+(myvec[0].second))==((myvec[1].first)+(myvec[1].second)))


要么

if(((myvec[0].first)+(myvec[0].second))<(string1+string2))


造成大量临时子字符串并使程序运行缓慢的原因。我修复了将字符串链接到一个字符串中的问题,这使得比较变得明显更快。

struct something{
    something(const string & a, const string &b)
    {
        firstsecond=a+'|'+b;
    }
    string firstsecond;
    int somethingelse;
};


谢谢你的建议顺便说一句。

最佳答案

我到达那里是因为我不想创建字符串的本地副本,所以我的问题是如何正确使用这些字符串的值。


老实说,在这种情况下使用指针将是一团糟。主要是因为指针并不像人们想象的那样容易使用。只需看看您现在拥有的代码即可。这是有问题的,因为例如something的默认构造函数将复制指针,从而有效地在两个something对象之间共享字符串。

我建议完全删除指针,并忽略此“性能”问题,直到您真正证明应用程序的瓶颈在于字符串的复制为止:

struct something {
    something(const string & a, const string &b)
    {
        first = a;
        second = b;
    }
    const string first;
    const string second;
    int somethingelse;
};

关于c++ - 如何正确使用结构体中的const字符串指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22443367/

10-12 14:58
查看更多