我想知道这两个选项中哪一个更安全:
#define MAXLEN 255
char buff[MAXLEN + 1]
Run Code Online (Sandbox Code Playgroud)
sprintf(buff, "%.*s", MAXLEN, name)
snprintf(buff, MAXLEN, "%s", name)
我的理解是两者都是一样的.请建议.
C++语法允许在struct/class中定义重载运算符,如:
struct X
{
void operator+(X);
}
Run Code Online (Sandbox Code Playgroud)
或者在struct/class之外,如:
void operator+(X, X);
Run Code Online (Sandbox Code Playgroud)
但不是
struct X
{
static void operator+(X, X);
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道这个决定的理由?为什么不允许第三种形式?(MSVC给出语法错误).也许这背后有一些故事?
ps同时存在第一个和第二个定义会产生歧义:
1>CppTest1.cxx
1>c:\ballerup\misc\cf_html\cpptest1.cxx(39) : error C2593: 'operator +' is ambiguous
1> c:\ballerup\misc\cf_html\cpptest1.cxx(13): could be 'void B1::operator +(B1 &)'
1> c:\ballerup\misc\cf_html\cpptest1.cxx(16): or 'void operator +(B1 &,B1 &)'
1> while trying to match the argument list '(B1, B1)'
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这种模糊性比1,3或2,3更好.
我的问题是
我有一个size_t数据,但现在我想将它转换为double或int.
如果我做的事情
size_t data = 99999999;
int convertdata = data;
Run Code Online (Sandbox Code Playgroud)
编译器将报告警告.因为它可能溢出
你有一些像boost或其他方法进行转换的方法吗?
在N3059中,我找到了对(和元组)的分段构造的描述(它在新标准中).
但是我不知道什么时候应该使用它.我发现了关于emplace和不可复制实体的讨论,但是当我尝试它时,我无法创建一个我需要 piecewiese_construct
或可以看到性能优势的案例.
例.我以为我需要一个不可复制的类,但是movebale(转发需要):
struct NoCopy {
NoCopy(int, int) {};
NoCopy(const NoCopy&) = delete; // no copy
NoCopy& operator=(const NoCopy&) = delete; // no assign
NoCopy(NoCopy&&) {}; // please move
NoCopy& operator=(NoCopy&&) {}; // please move-assign
};
Run Code Online (Sandbox Code Playgroud)
然后,我想到标准对构造会失败:
pair<NoCopy,NoCopy> x{ NoCopy{1,2}, NoCopy{2,3} }; // fine!
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.实际上,这是我所期望的,因为"移动东西"而不是在stdlib中的任何地方复制它应该是.
因此,我认为我没有理由这样做,或者说:
pair<NoCopy,NoCopy> y(
piecewise_construct,
forward_as_tuple(1,2),
forward_as_tuple(2,3)
); // also fine
Run Code Online (Sandbox Code Playgroud)
piecewise_construct
?好的作为前言我需要缓存很少修改数据的相对较小的子集,以避免出于性能原因频繁查询数据库.这些数据大量用于只读意义,因为它通常由其他表中的更大数据集引用.
我编写了一个类,它能够在内存中基本上存储所讨论的两个表的全部内容,同时监听提交更改以及用于更新缓存对象的线程安全回调机制.
我当前的实现有两个std::vectors
用于每个表的元素.该类提供两个访问每个矢量的整体以及方便的方法用于搜索通过表数据的特定元素std::find
,std::find_if
等.
有谁知道,如果使用std::list
,std::set
或者std::map
在std::vector
用于搜索将是可取的?大多数情况下,在建立新连接后从数据库填充一次后将要求这些容器.
我也愿意使用VS2010或Boost支持的C++ 0x功能.
例如,是否可以在C++中使用可选的模板参数
template < class T, class U, class V>
class Test {
};
Run Code Online (Sandbox Code Playgroud)
在这里,我希望用户使用V
或不使用此类V
是否可能
Test<int,int,int> WithAllParameter
Test<int,int> WithOneMissing
Run Code Online (Sandbox Code Playgroud)
如果是,如何做到这一点.
是否有一个我可以使用或构建的C++容器,可以包含,比如int
和string
和double
类型?我面临的问题是每当我尝试填充地图,矢量或列表时,例如,以下内容:
int x;
string y;
double z;
Run Code Online (Sandbox Code Playgroud)
我受限于以下格式:
list<int> mycountainer;
vector<string> mycontainer;
Run Code Online (Sandbox Code Playgroud)
哪种力量mycontainer
只包含一种类型.
在任何人提出泛型之前,由于C++附带的标准vector
和list
容器已经是通用的,因此它们无法工作 - 它们可以是任何类型的容器,但不能包含多种类型.
如果可能的话,我也想避免使用Boost - 我更喜欢它,如果有一种简单的方法我可以自己编码.
[编辑]嘿伙计,非常感谢你的建议 - 我应该解释我将如何使用这个容器,但它有点复杂,因此上面的(大)简化.我认为这里最好的选择是使用Boost.再次感谢.
我有以下数据:
FolioA Name1 100
FolioA Name2 110
FolioA Name3 100
FolioB Name1 100
FolioB Name3 106
FolioC Name1 108
FolioC Name2 102
FolioC Name3 110
Run Code Online (Sandbox Code Playgroud)
我想只插入唯一的名称(即Name1,Name2和Name3,每一次)
std::vector<std::string> name;
Run Code Online (Sandbox Code Playgroud)
当我遍历数据时.
所以,我有以下代码,我将数据存储在名为test的地图中:
std::map<std::string, std::map<std::string, double> >test;
std::map<std::string, std::map<std::string, double > >::iterator it1 = test.begin(), end1 = test.end();
while (it1 !=end1) {
std::map<std::string, double>::iterator it2 = it1->second.begin(), end2=it1->second.end();
**name.push_back(it2->first);**
++it2;
}
++it1;
}
Run Code Online (Sandbox Code Playgroud)
但是,目前通过按照我的方式将数据推送到名称的名称为Name1的2个实例,Name2的2个实例和Name3的3个实例,这是我的代码所期望的.如何修复它只有唯一的名称.
有没有一种简单的方法可以将a的所有元素添加vector
到unordered_set
?它们属于同一类型.现在,我正在使用for循环,并想知道是否有更好的方法来做到这一点
什么时候我应该做一个功能private
,为什么这是个好主意?