我的意思是 - 我们知道这些std::map元素是根据键排序的.所以,让我们说键是整数.如果我从迭代std::map::begin()来std::map::end()使用for,不标准的保证,我会通过与键的元素,按升序排序结果迭代?
例:
std::map<int, int> map_;
map_[1] = 2;
map_[2] = 3;
map_[3] = 4;
for( std::map<int, int>::iterator iter = map_.begin();
iter != map_.end();
++iter )
{
std::cout << iter->second;
}
Run Code Online (Sandbox Code Playgroud)
这是保证打印234还是实现定义?
现实生活中的原因:我有一个std::map带int钥匙.在非常罕见的情况下,我想用键来迭代所有元素,而不是具体的int值.是的,听起来似乎std::vector是更好的选择,但请注意我的"非常罕见的情况".
编辑:我知道,元素std::map是排序的..没有必要指出它(这里的大多数答案).我甚至在我的问题中写过它.
我在迭代容器时询问迭代器和顺序.谢谢@Kerrek SB的答案.
我想解析/proc/net/tcp/,但它安全吗?
我应该如何打开和读取文件,/proc/而不是害怕,某些其他进程(或操作系统本身)将在同一时间更改它?
为什么我不cout string喜欢这个:
string text ;
text = WordList[i].substr(0,20) ;
cout << "String is : " << text << endl ;
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到以下错误:
错误2错误C2679:二进制'<<':找不到带有'std :: string'类型的右手操作数的运算符(或者没有可接受的转换)c:\ users\mollasadra\documents\visual studio 2008\projects\barnamec\barnamec\barnamec.cpp 67 barnamec**
令人惊讶的是,即使这不起作用:
string text ;
text = "hello" ;
cout << "String is : " << text << endl ;
Run Code Online (Sandbox Code Playgroud) 例如bash,在C/C++中众所周知的前向声明是否有类似的东西或至少类似的东西(解决方法)?
或者有这样的事情,因为例如它总是一次性执行(一行一行)?
如果没有前向声明,我该怎么做才能使我的脚本更容易阅读.它相当长,这些函数定义在开始时与全局变量混合,使我的脚本看起来很难看,难以阅读/理解)?我要求学习一些这些案例的知名/最佳实践.
例如:
# something like forward declaration
function func
# execution of the function
func
# definition of func
function func
{
echo 123
}
Run Code Online (Sandbox Code Playgroud) 我很震惊,这是允许的:
if( int* x = new int( 20 ) )
{
std::cout << *x << "!\n";
// delete x;
}
else
{
std::cout << *x << "!!!\n";
// delete x;
}
// std:cout << *x; // error - x is not defined in this scope
Run Code Online (Sandbox Code Playgroud)
那么,这是标准允许的还是只是编译器扩展?
PS由于有几条评论 - 请忽略这个例子是"坏"或危险的.我知道.这只是我想到的第一件事,作为一个例子.
我有一个.log以这种语法存储在a 中的文件列表:
c:\foto\foto2003\shadow.gif
D:\etc\mom.jpg
Run Code Online (Sandbox Code Playgroud)
我想从这些文件中提取名称和扩展名.你能给出一个简单方法的例子吗?
我使用的接收数据作为图书馆vector的char秒.我需要传递string给图书馆.
我想使用std::vector接受迭代器的构造函数来执行转换 - 但是想知道是否有更好的方法呢?
/*Note: json_str is of type std::string*/
const std::vector<char> charvect(json_str.begin(), json_str.end());
Run Code Online (Sandbox Code Playgroud) 指针只是一个地址吗?或者我错过了什么?
我测试了几种类型的指针:
但是指向成员函数的指针更大 - 我的平台上有16B.
三件事:
void*必须能够"包含"任何指针类型.换句话说,任何指针必须能够被转换为void*,对吧?如果是这样,那么为什么sizeof( void* )是8,而sizeof指向成员函数的指针是16?C++风格与性能 - 使用C风格的东西,比一些C++等价物更快,这是不好的做法?例如:
不要使用atoi(),itoa(),atol()等!使用std::stringstream< - 有时可能更好,但总是如此?使用C函数有什么不好的?是的,C风格,而不是C++,但不管怎样?这是C++,我们一直在寻找性能..
永远不要使用原始指针,而是使用智能指针 - 好吧,它们真的很有用,每个人都知道,我知道,我一直使用它,我知道它们是多少更好的原始指针,但有时它是完全安全的使用原始指针..为什么不呢?"不是C++风格?< - 这够了吗?
不要使用按位操作 - 太C风格?WTH?为什么不,当你确定你在做什么?例如 - 不要按位交换变量(a ^= b; b ^= a; a ^= b;) - 使用标准的3步交换.不要使用左移乘以2.等等......(好吧,这不是C++风格与C风格,但仍然是"不好的做法")
最后,最昂贵的 - "不要使用enum-s来返回代码,它也是C风格,使用异常来处理不同的错误"?为什么?好吧,当我们谈论深层次的错误处理时 - 好的,但为什么总是?这有什么不对,例如 - 当我们谈论一个函数时,它返回不同的错误代码,当错误处理只在函数中实现时,它会调用第一个错误代码?我的意思是 - 不需要在上层传递错误代码.例外是相当缓慢的,它们是特殊情况的例外,而不是美丽.
等等等
好的,我知道良好的编码风格非常非常重要 < - 代码应该易于阅读和理解.我知道微优化并不需要,因为现代编译器非常智能,编译器优化非常强大.但我也知道异常处理有多昂贵,如何实现(某些)smart_pointers,并且一直没有需要smart_ptr ......例如,我知道这atoi不是那么"安全" std::stringstream,但仍然如此.那表现怎么样?
编辑:我不是在谈论一些非常困难的东西,它们只是C风格的特定.我的意思是 - 不要错过使用函数指针或虚拟方法以及C++程序员可能不知道的这些东西,如果从未使用过这类东西(而C程序员一直这样做).我正在谈论一些更常见和更容易的事情,例如在示例中.
在C++,在类构造函数中,我启动了一个新的线程,其中this指针作为参数,将广泛用于线程(例如,调用成员函数).这是件坏事吗?为什么以及后果是什么?
我的线程启动过程位于构造函数的末尾.
c++ ×9
c ×2
standards ×2
string ×2
bash ×1
coding-style ×1
constructor ×1
cout ×1
dictionary ×1
file-io ×1
function ×1
if-statement ×1
linux ×1
performance ×1
pointers ×1
procfs ×1
sh ×1
stl ×1
this ×1
unix ×1
variables ×1