小编Kir*_*rov的帖子

迭代通过std :: map的顺序是否已知(并由标准保证)?

我的意思是 - 我们知道这些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::mapint钥匙.在非常罕见的情况下,我想用键来迭代所有元素,而不是具体的int值.是的,听起来似乎std::vector是更好的选择,但请注意我的"非常罕见的情况".


编辑:我知道,元素std::map是排序的..没有必要指出它(这里的大多数答案).我甚至在我的问题中写过它.
我在迭代容器时询问迭代器和顺序.谢谢@Kerrek SB的答案.

c++ standards dictionary stl

149
推荐指数
4
解决办法
7万
查看次数

解析/ proc /文件是否安全?

我想解析/proc/net/tcp/,但它安全吗?

我应该如何打开和读取文件,/proc/而不是害怕,某些其他进程(或操作系统本身)将在同一时间更改它?

c c++ unix linux procfs

148
推荐指数
5
解决办法
1万
查看次数

为什么我不能唱一个字符串?

为什么我不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)

c++ string cout

130
推荐指数
3
解决办法
21万
查看次数

在Bash或Shell脚本中转​​发函数声明?

例如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)

bash function sh forward-declaration

89
推荐指数
2
解决办法
2万
查看次数

在if语句的条件部分定义变量?

我很震惊,这是允许的:

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由于有几条评论 - 请忽略这个例子是"坏"或危险的.我知道.这只是我想到的第一件事,作为一个例子.

c++ variables standards if-statement

69
推荐指数
4
解决办法
1万
查看次数

如何从C++中的路径中提取文件名和扩展名

我有一个.log以这种语法存储在a 中的文件列表:

c:\foto\foto2003\shadow.gif
D:\etc\mom.jpg
Run Code Online (Sandbox Code Playgroud)

我想从这些文件中提取名称和扩展名.你能给出一个简单方法的例子吗?

c++ string file-io

65
推荐指数
4
解决办法
8万
查看次数

将std :: string转换为std :: vector <char>

我使用的接收数据作为图书馆vectorchar秒.我需要传递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)

c++

41
推荐指数
2
解决办法
4万
查看次数

为什么指向函数的指针大小与指向成员函数的指针大小不同?

指针只是一个地址吗?或者我错过了什么?

我测试了几种类型的指针:

  • 指向任何变量的指针是相同的(我平台上的8B)
  • 指向函数的指针大小相同,作为指向变量的指针(8B再次)
  • 指向具有不同参数的函数的指针 - 仍然相同(8B)

但是指向成员函数的指针更大 - 我的平台上有16B.

三件事:

  1. 为什么指向成员函数的指针更大?他们需要更多信息?
  2. 据我所知,标准只字未提指针的大小,除了void*必须能够"包含"任何指针类型.换句话说,任何指针必须能够被转换为void*,对吧?如果是这样,那么为什么sizeof( void* )是8,而sizeof指向成员函数的指针是16?
  3. 是否还有其他指针示例,它们具有不同的大小(我的意思是,对于标准平台,不是一些稀有和特殊的平台)?

c++ pointers member-function-pointers function-pointers

28
推荐指数
2
解决办法
6831
查看次数

C++风格与性能?

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 c++ performance coding-style

27
推荐指数
3
解决办法
3704
查看次数

C++在构造函数中使用此指针

C++,在类构造函数中,我启动了一个新的线程,其中this指针作为参数,将广泛用于线程(例如,调用成员函数).这是件坏事吗?为什么以及后果是什么?

我的线程启动过程位于构造函数的末尾.

c++ multithreading constructor this

25
推荐指数
1
解决办法
2万
查看次数